您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么在Docker中運行Jupyter/Spark/Mesos服務”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在Docker中運行Jupyter/Spark/Mesos服務。
Spark on Docker,基于Jupyter Notebook Python, Scala, R, Spark, Mesos技術棧,提供一個遠程操作的模型和任務編寫Web界面,采用Python界著名的Ipython Notebook格式,非常簡潔、友好。
Jupyter Notebook 4.2.x
Conda Python 3.x 和 Python 2.7.x 環境
Conda R 3.2.x 環境
Scala 2.10.x
pyspark, pandas, matplotlib, scipy, seaborn, scikit-learn 預先安裝在Python環境
ggplot2, rcurl 原裝在 R 環境
Spark 1.6.0,運行在local模式,或者連接到 Spark workers的集群
Mesos client 0.22 binary that can communicate with a Mesos master
非私有用戶名 jovyan
(uid=1000, 可配置, 參見相應的選項) 在組 users
(gid=100) ,擁有控制權在目錄 /home/jovyan
和 /opt/conda
tini 作為容器入口點, start-notebook.sh 作為啟動命令
腳本 start-singleuser.sh 作為可選命令,運行Notebook server的single-user實例 , 是 JupyterHub 要求的
Options for HTTPS, password auth, and passwordless sudo
使用下面的命令啟動一個容器,Web服務在端口 8888,為配置授權(僅限私網內使用,不要配置在互聯網和其他公共網上)。
docker run -d -p 8888:8888 jupyter/all-spark-notebook
一般情況下,需要訪問宿主機中的數據資源,使用-v host-path:docker-path方式映射。
啟動后在瀏覽器輸入: http://127.0.0.1:8888即可訪問。
使用Spark在小型的本地數據環境下的配置。
運行一個容器,像上面那樣。
打開一個Python 2 或 3 notebook。
創建 SparkContext在
local 模式。
例如,在notebook的第一個cell中,如下:
import pyspark sc = pyspark.SparkContext('local[*]') # do something to prove it works rdd = sc.parallelize(range(1000)) rdd.takeSample(False, 5)
運行一個容器,像上面那樣。
打開一個 R notebook。
初始化 sparkR
,在local模式。
初始化 sparkRSQL
。
例如,在 R notebook的第一個cell中,如下:
library(SparkR) sc <- sparkR.init("local[*]") sqlContext <- sparkRSQL.init(sc) # do something to prove it works data(iris) df <- createDataFrame(sqlContext, iris) head(filter(df, df$Petal_Width > 0.2))
運行一個容器,像上面那樣。
打開一個 Apache Toree (Scala) notebook。
使用預先配置的SparkContext,引用變量
sc
。
例如:
val rdd = sc.parallelize(0 to 999) rdd.takeSample(false, 5)
這里的配置允許你的計算集群和數據一起伸縮。
部署 Spark 到 Mesos。
配置每一個工作節點 the --no-switch_user
flag 或者創建jovyan
用戶在每一個 slave節點上。
運行Docker容器,帶參數 --net=host
在所有的Spark Workers都能訪問的網絡位置(查看 Spark networking requirement.)
注意: When using --net=host
, you must also use the flags --pid=host -e TINI_SUBREAPER=true
. See
Follow the language specific instructions below.
打開 Python 2 或 3 notebook.
創建 SparkConf
實例,指向 Mesos master node (or Zookeeper instance) 和 Spark 二進制包的位置。
創建 SparkContext
采用上面的配置變量。
示例, Python 3 notebook的第一個Cell像下面這樣:
import os # make sure pyspark tells workers to use python3 not 2 if both are installed os.environ['PYSPARK_PYTHON'] = '/usr/bin/python3' import pyspark conf = pyspark.SparkConf() # point to mesos master or zookeeper entry (e.g., zk://10.10.10.10:2181/mesos) conf.setMaster("mesos://10.10.10.10:5050") # point to spark binary package in HDFS or on local filesystem on all slave # nodes (e.g., file:///opt/spark/spark-1.6.0-bin-hadoop2.6.tgz) conf.set("spark.executor.uri", "hdfs://10.10.10.10/spark/spark-1.6.0-bin-hadoop2.6.tgz") # set other options as desired conf.set("spark.executor.memory", "8g") conf.set("spark.core.connection.ack.wait.timeout", "1200") # create the context sc = pyspark.SparkContext(conf=conf) # do something to prove it works rdd = sc.parallelize(range(100000000)) rdd.sumApprox(3)
如果使用在notebook和workers中使用Python 2, 修改環境變量PYSPARK_PYTHON
指向Python 2.x 解釋器二進制包的位置。如果不設置, 缺省值為 python
。
當然, 所有的可以被隱藏在 IPython kernel startup script, 但是 "explicit is better than implicit." :)
如上的方法運行一個容器實例。
打開一個 R notebook。
初始化 sparkR
,指向Mesos master node (or Zookeeper instance) , Spark 二進制包位置。
初始化 sparkRSQL
.
示例, 在 R notebook的第一個Cell:
library(SparkR) # point to mesos master or zookeeper entry (e.g., zk://10.10.10.10:2181/mesos)\ # as the first argument # point to spark binary package in HDFS or on local filesystem on all slave # nodes (e.g., file:///opt/spark/spark-1.6.0-bin-hadoop2.6.tgz) in sparkEnvir # set other options in sparkEnvir sc <- sparkR.init("mesos://10.10.10.10:5050", sparkEnvir=list( spark.executor.uri="hdfs://10.10.10.10/spark/spark-1.6.0-bin-hadoop2.6.tgz", spark.executor.memory="8g" ) ) sqlContext <- sparkRSQL.init(sc) # do something to prove it works data(iris) df <- createDataFrame(sqlContext, iris) head(filter(df, df$Petal_Width > 0.2))
打開一個終端,通過 New -> Terminal 在notebook 界面上。
添加關于集群的信息到 SPARK_OPTS
環境變量,當運行容器時.
打開一個Apache Toree (Scala) notebook。
使用預先配置的SparkContext
,在變量名 sc中。
Apache Toree 內核自動創建了SparkContext,在啟動時按照命令行參數和環境變量創建
。 您可以傳遞關于你的 Mesos cluster的信息,當啟動容器時通過 SPARK_OPTS
環境變量來實現。
例如, 傳遞的信息:Mesos master, Spark binary location in HDFS, and an executor options, 像下面這樣啟動容器:
docker run -d -p 8888:8888 -e SPARK_OPTS '--master=mesos://10.10.10.10:5050 \ --spark.executor.uri=hdfs://10.10.10.10/spark/spark-1.6.0-bin-hadoop2.6.tgz \ --spark.executor.memory=8g' jupyter/all-spark-notebook
注意,這跟上面在Python notebook的信息時一樣的。 一旦內核得到集群的信息, 你可以在Apache Toree notebook測試集群,像下面這樣:
// should print the value of --master in the kernel spec println(sc.master) // do something to prove it works val rdd = sc.parallelize(0 to 99999999) rdd.sum()
通過Standalone Mode連接到 Spark Cluster要求的設置如下:
確認docker image (檢查 Dockerfile) 和Spark Cluster被部署、運行的是Spark的同一個版本。
Deploy Spark on Standalone Mode.
運行Docker container 帶參數 --net=host
在Spark workers都能訪問到的網絡位置. (查看 Spark networking requirement.)
注意: 當使用 --net=host
, 必須同時使用 --pid=host -e TINI_SUBREAPER=true
. 查看詳情: https://github.com/jupyter/docker-stacks/issues/64 。
特殊語言的指令與上面Mesos里提到的完全一樣, 只是這里的master url 變成類似于這樣: spark://10.10.10.10:7077
你可以傳入 Jupyter command line options ,通過 start-notebook.sh
command,在容器啟動時設置參數。例如,設置notebook server 基礎URL,想下面這樣:
docker run -d -p 8888:8888 jupyter/all-spark-notebook start-notebook.sh --NotebookApp.base_url=/some/path
你可以繞開 start-notebook.sh
腳本,直接在命令中指定。如果這樣
, 下面提到的NB_UID
和 GRANT_SUDO
特征將不能工作。具體細節查看Docker Options一節。
你可以定制Docker容器和Notebook Server的執行,通過制定下面的參數:
-e PASSWORD="YOURPASS"
- 配置 Jupyter Notebook 要求 password,在非信任的網絡上可以組合 USE_HTTPS
使用加密的連接。
-e USE_HTTPS=yes
- 配置 Jupyter Notebook接受加密連接。如果 pem
文件(包含 SSL certificate 和 key)未被提供(參見下面), 容器將創建一個self-signed certificate。
-e NB_UID=1000
- 指定jovyan
user的uid。 對于裝載宿主機卷標并制定文件屬有權是有用。為了該選項發揮作用, 必須運行容器時帶上 --user root
. ( 腳本start-notebook.sh
將在調整user id后運行 su jovyan。
)
-e GRANT_SUDO=yes
- 給予jovyan
用戶帳號無密碼執行 sudo
的權限。在安裝操作系統軟件包是有用。為了該選項發揮作用, 運行容器時必須使用--user root
。(腳本start-notebook.sh
將在添加jovyan
到 sudoers 后運行su jovyan
。) 你應該只在信任該用戶或者容器運行在隔離的宿主環境下時才打開這個sudo選項。
-v /some/host/folder/for/work:/home/jovyan/work
- 宿主機加載缺省工作目錄到宿主機,從而當容器終止或重建時能夠保存工作的結果在宿主機中。
-v /some/host/folder/for/server.pem:/home/jovyan/.local/share/jupyter/notebook.pem
- 加載SSL certificate plus key為 USE_HTTPS所用。
當有一個域的證書并且Notebook Server運行在下面時有用。
-p 4040:4040
- 打開端口用于Spark的運行狀態監視,參見 Spark Monitoring and Instrumentation UI. 注意,每一個新的spark context創建時賦予一個增量的端口號 (ie. 4040, 4041, 4042, etc.), 并且可能需要打開多個端口。docker run -d -p 8888:8888 -p 4040:4040 -p 4041:4041 jupyter/all-spark-notebook
在這個Docker鏡像中notebook server的配置需要一個 notebook.pem
文件,該文件包含base64編碼的SSL key和SSL 證書。 該文件還包含其他的證書 (e.g., intermediate 和 root certificates)。
如果你的 key 和 certificate(s) 作為獨立的文件, 你需要將它們合并成一個 PEM 文件。 作為可選的方式, 你可以創建自己的配置和 Docker鏡像,可以使用分開的 key 和 certificate 文件。
更多的使用SSL的信息, 參見下面:
例子 docker-stacks/examples 可以得到信息,關于在公共域使用本文的技術棧時如何使用加密證書 Let's Encrypt 。
文件 jupyter_notebook_config.py 包含了本Docker鏡像如何創建self-signed certificate的信息。
文檔 Jupyter Notebook documentation 包含了一些最佳實踐,包括如何運行一個公共 notebook server,大部分內容已經包含在了本鏡像中。
缺省的Python 3.x Conda 運行環境 安裝在 /opt/conda
目錄下。第二個Python 2.x Conda 環境安裝在 /opt/conda/envs/python2
目錄下。你可以切換到 python2 環境 ,在shell里面鍵入命令(這是通用的conda環境切換方法,使用conda create可以創建更多的環境):
source activate python2
你可以回到缺省的環境,在shell里鍵入下面的命令:
source deactivate
命令 jupyter
, ipython
, python
, pip
, easy_install
, 和 conda
(以及其它) 在兩個環境下都是可用的。通常,你可以安裝軟件到兩個環境中,無論哪一個環境是激活的,像下面這樣(注意:conda install使用了-n參數指定環境的名稱):
# install a package into the python2 environment pip2 install some-package conda install -n python2 some-package # install a package into the default (python 3.x) environment pip3 install some-package conda install -n python3 some-package
JupyterHub 要求每一個用戶有一個Jupyter Notebook server的single-user實例。為了使用 JupyterHub 和 DockerSpawner,在本技術棧中,你需要指定容器鏡像名稱和覆蓋缺省的容器run命令,在 jupyterhub_config.py
文件中指定:
# Spawn user containers from this image c.DockerSpawner.container_image = 'jupyter/all-spark-notebook' # Have the Spawner override the Docker run command c.DockerSpawner.extra_create_kwargs.update({ 'command': '/usr/local/bin/start-singleuser.sh' })
“怎么在Docker中運行Jupyter/Spark/Mesos服務”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。