文档章节

GIScript2016-Docker上的Jupyter Notebook部署

openthings
 openthings
发布于 2016/09/20 13:26
字数 1632
阅读 347
收藏 3

GIScript2016是支持Python3的地理空间数据处理和分析工具包。

GIScript2016支持Jupyter和Spark,可以运行在单机以及大规模集群之上。GIScript with Jupyter+Spark on Docker这一技术栈非常强大,通过conda包管理程序还可以安装大量的科学计算包,如NumPy、Scikit、Pandas以及OpenCV、NLTK、Tensorflow、Keras等机器学习软件包,实在是大数据处理、分析和深入研究的神器。

GIScript 2016 on Docker with Jupyter+Spark

GIScript2016将C++系统库封装为Python的过程全部开源了出来,方便研究者使用C++编写自己的专业算法库,然后添加到这个框架中来,是编写高性能的Python扩展模块的极佳参考。

下面我们在Docker中进行部署GIScript2016的方法,然后使用Jupyter Notebook进行基于浏览器的访问。一旦环境设置完毕,就可以在很多环境下部署Docker容器,使用非常方便。Jupyter Notebook是基于浏览器的编程“笔记本”,非常适合进行数据探索类的研究。

1.安装支持环境

1.1 安装Docker容器支持环境

我用的Mac OS X,现在的Docker已经原生支持了,不用像以前要安装VirtualBox,再使用Vagrant了。
到这里http://www.docker.io下载相应的版本,然后运行安装程序,就可以了。

如果使用Ubuntu,建议使用 http://get.docker.io下载的脚本进行安装,官方的安装方法貌似与Ubuntu内置的lxd有冲突,经常出问题。方法如下:

wget http://get.docker.io -O docker-setup.sh
sudo chmod +x docker-setup.sh
./docker-setup.sh

1.2 安装Jupyter Notebook容器

采用Jupyter的官方Docker技术栈

docker run -it --name GISpark 
    -p 9000:8888 
    --user root -e GRANT_SUDO=yes 
    -v /本地目录/GISpark:/home/jovyan/work/GISpark 
    jupyter/all-spark-notebook

1.3 安装和更新容器内软件

打开浏览器,输入:http://localhost:9000。

在里面打开一个终端窗口,运行升级程序,安装需要的软件:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-dev

2. 下载和编译GIScript2016

2.1 下载源代码

git clone https://git.oschina.net/GIScript/GIScript2016.git

2.2 安装SIP

进入SIP目录,首先进入3dParty,运行:

python3 configure.py
make 
sudo make install

2.3 编译GIScript代码

返回上级目录,运行:

python3 configure.py

进入Build目录,运行:

sudo make install

2.4 编译问题解决

  • 嗯,<sip.h>没找到?

进去SIP/Build目录,打开GNUmake.opt文件,按照下面修改:

# Set python.  If you don't
#PY_LIB     = "/usr/lib/python3"
#PY_INCLUDE = "/usr/include/python3.5m"
PY_LIB     = "/opt/conda/lib/python3.5"
PY_INCLUDE = "/opt/conda/include/python3.5m"

再次运行make,又出现fatal error: X11/Xlib.h: No such file or directory,估计是缺少x11的支持库了。
安装x11的开发库:

sudo apt-get install libx11-dev

再次运行make,编译通过。

3. 运行测试

运行python3,输入:

from GIScript import GISCore

显示找不到啊,到/opt/conda/lib/python3.5/dist-packages下去看,文件全都在呢!

3.1 安装Python的GIScript库

估计是权限呐、路径呐啥的没有找到。换个目录试试:

cp GIScript ../site-packages

再次运行,这次成功了,不过又提示libSuBase.so: cannot open shared object file: No such file or directory。有一些基础动态库没有找到,下面还需要设置一下UGC基础库的路径。

3.2 设置UGC动态库的访问路径

这里需要修改start.sh这个文件,在启动Jupyter是设置,这个文件/usr/local/bin/目录下。 首先拷贝过来,修改,再拷贝回去。在前面添加内容:

# Add GIScript Library Path of UGC.
export SUPERMAP_HOME=/home/jovyan/work/supermap/GIScript2016
export LD_LIBRARY_PATH=$SUPERMAP_HOME/Bin64_Linux_gcc4_9:$LD_LIBRARY_PATH

然后重新启动docker。

docker stop GISpark
docker start GISpark

参考这里设置动态库的路径。除了上面的路径之外,因为Ubuntu14.04有点老了,还有一些系统库的版本需要更新。

cd /opt/conda/lib    #运行环境的系统库目录,根据版本不同。
mv libstdc++.so libstdc++.so.x
mv libstdc++.so.6 libstdc++.so.6.x
mv libsqlite3.so.0 libsqlite3.so.0.x
mv libsqlite3.so libsqlite3.so.x
mv libgomp.so.1.0.0 libgomp.so.1.0.0.x
mv libgomp.so.1 libgomp.so.1.x
mv libgomp.so libgomp.so.x

3.3 运行例程

3.3.1 Jupyter Notebook

from GIScript import GISCore
print(GISCore)

将显示GISCore的帮助信息,系统配置成功。

3.3.2 Spark Shell

from GIScript import GISCore
from GIScript import Data
from pyspark import SparkConf, SparkContext

APP_NAME = "GeoTest For Spark"
 
def main(sc):
    pnt = GISCore.Point2D(12.0,32.0)
    geo = Data.GeoPoint()
    b = geo.Make(pnt)
    br = sc.broadcast(geo)
    c = sc.parallelize(range(0,1000),10).map(lambda x:br.value.GetPoint()).collect()
    for i in c:
        print(i)

    sc.stop()

if __name__ == "__main__":
    # Configure Spark
    conf = SparkConf().setMaster("spark://master:7077")
    conf = conf.setAppName(APP_NAME)
    sc   = SparkContext(conf=conf)

    main(sc)

3.3.3 获取文件信息

# coding: utf-8

import sys
from GIScript import GISCore,Conversion

'''
! \brief 文件路径定义
'''
strTiffPath  = "Raster/astronaut(CMYK)_32.tif"

if __name__ == '__main__':    
    try:
        fileParser = Conversion.FileParser()
        bOpen = fileParser.Open(strTiffPath, "fileTIF")
        if bOpen:
            rasterInfo  = fileParser.GetRasterInfo()
            nWidth      = rasterInfo.GetWidth()
            nHeight     = rasterInfo.GetHeight()
            pixelFormat = rasterInfo.GetPixelFormat()
            rc2Bounds   = rasterInfo.GetBounds()
            nBandCount  = rasterInfo.GetBandCount()
            nBlockSize  = rasterInfo.GetBlockSize()
            strPrj      = rasterInfo.GetProjection()
            dXRatio     = rc2Bounds.Width()/nWidth
            dYRatio     = rc2Bounds.Height()/nHeight
            colorset    = rasterInfo.GetColorset()
            dMax        = rasterInfo.GetMax()
            dMin        = rasterInfo.GetMin()
            dNoValue    = rasterInfo.GetNoValue()

            print("=========文件基本信息=========")
            print(" 图片宽:" , nWidth)
            print(" 图片高:" , nHeight)
            print(" 像素格式:",pixelFormat)
            print(" 波段数:", nBandCount)
            print(" 块大小:",nBlockSize)
            print(" 是否是块存储数据:",rasterInfo.GetIsTile())
            print(" Bound范围(左上右下):(", rc2Bounds.left, ","\
                    ,rc2Bounds.top,  ",", rc2Bounds.right, ",", rc2Bounds.bottom, ")")

            print(" X、Y分辨率:", dXRatio, dYRatio)
            print(" 颜色表大小:" , len(colorset))
            print(" 极大值:" , dMax)
            print(" 极小值:" , dMin)
            print(" 无值:", dNoValue)
            

            if strPrj != "":
                print(" 投影:", strPrj)
            else:
                print(" 投影:平面坐标系")

            print("=============================")

            fileParser.Close()

    except SystemExit:
        raise
    except:
        sys.stderr.write(
"""An internal error occured.
""")
        raise

4. 后续计划

上面的配置完成后,我们能够已经充分体会到了GIScript with Jupyter+Spark on Docker这一技术栈的强大能力,尤其是通过conda包管理程序还可以非常容易地进行各种科学计算包的安装,实在是大数据处理、分析和深入研究的神器。下一步为了更好地部署和共享:

  • 保存Docker 容器为镜像(docker commit),并推送到Docker Hub,这样其他人就可以通过docker pull快速搭建自己的环境了。
  • 将上面的脚本整理为一个Dockerfile,从而可以快速从头编译自己的镜像,其他人也可以在此基础上进一步完善或添加自己的模块,提供更好的灵活性。
  • 编写更多更好的Jupyter Notebook例程和教程,方便初学者更快地掌握这一强大的工具。

© 著作权归作者所有

openthings
粉丝 323
博文 1140
码字总数 689435
作品 1
东城
架构师
私信 提问
加载中

评论(3)

kevin_meng
kevin_meng

from GIScript import GISCore
from GIScript import GISCore

from GIScript import GISCore
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-bdf625506a51> in <module>()
----> 1 from GIScript import GISCore

ImportError: No module named 'GIScript'

请问启动容器之后报错了 怎么回事?
openthings
openthings 博主
Docker基础镜像下载太慢,增加了阿里云的Docker镜像库地址。
g
geowangsh
实现了跨越~
GIScript2016-Docker 数据导入教程

GIScript2016是支持Python3的地理空间数据处理和分析工具包,支持Jupyter和Spark,可以运行在单机以及大规模集群之上。这里介绍基于Docker的GIScript+Jupyter这一技术栈,使用其进行空间数据...

openthings
2016/10/13
31
0
GIScript2016-Docker 快速入门

GIScript2016是支持Python3的地理空间数据处理和分析工具包,支持Jupyter和Spark,可以运行在单机以及大规模集群之上。GIScript with Jupyter+Spark on Docker这一技术栈非常强大,通过conda...

openthings
2016/10/09
115
0
数据科学家Docker入门指南

Docker容器是通过虚拟化开发和部署应用程序的一种越来越流行的方式,它对数据科学家有用吗?当然,本指南就会向你介绍它的作用,并手把手教你快速入门。 介绍 Docker是一种越来越流行的,使在...

【方向】
2018/09/09
0
0
把jupyter-notebook装进docker里

jupyter-notebook是我很喜欢的工具,搭环境稍显麻烦,其实jupyter web形式的使用方式,最好的部署方式是在云上,一次部署到哪里都可以使用,岂不快哉。现在各家云服务器还挺贵的,docker出来...

JungleKing
2018/06/27
495
0
基于Docker+Jupyter+Python的科学计算环境

原文地址:https://github.com/jupyter/docker-stacks/tree/master/scipy-notebook Jupyter Notebook Scientific Python Stack 基于Docker+Jupyter+Python的科学计算环境,提供快速部署的一站......

openthings
2016/09/18
660
0

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
4分钟前
1
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
7分钟前
2
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
8分钟前
2
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
32分钟前
3
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部