Jupyter Notebook Python, Scala, R, Spark, Mesos

在Docker中運行Jupyter/Spark/Mesos服務。html

來源[英]:https://github.com/jupyter/docker-stacks/tree/master/all-spark-notebooknode

Spark on Docker,基於Jupyter Notebook Python, Scala, R, Spark, Mesos技術棧,提供一個遠程操做的模型和任務編寫Web界面,採用Python界著名的Ipython Notebook格式,很是簡潔、友好。python

集成的軟件

  • 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,爲配置受權(僅限私網內使用,不要配置在互聯網和其餘公共網上)。git

docker run -d -p 8888:8888 jupyter/all-spark-notebook

通常狀況下,須要訪問宿主機中的數據資源,使用-v host-path:docker-path方式映射。github

啓動後在瀏覽器輸入: http://127.0.0.1:8888便可訪問。sql

啓動Spark:Local Mode

使用Spark在小型的本地數據環境下的配置。docker

在Python Notebook:

  1. 運行一個容器,像上面那樣。
  2. 打開一個Python 2 或 3 notebook。
  3. 建立 SparkContext在 local 模式。

例如,在notebook的第一個cell中,以下:shell

import pyspark
sc = pyspark.SparkContext('local[*]')

# do something to prove it works
rdd = sc.parallelize(range(1000))
rdd.takeSample(False, 5)

在 R Notebook:

  1. 運行一個容器,像上面那樣。
  2. 打開一個 R notebook。
  3. 初始化 sparkR,在local模式。
  4. 初始化 sparkRSQL

例如,在 R notebook的第一個cell中,以下:apache

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:

  1. 運行一個容器,像上面那樣。
  2. 打開一個 Apache Toree (Scala) notebook。
  3. 使用預先配置的SparkContext,引用變量 sc

例如:瀏覽器

val rdd = sc.parallelize(0 to 999)
rdd.takeSample(false, 5)

鏈接到Mesos上的 Spark 集羣

這裏的配置容許你的計算集羣和數據一塊兒伸縮。

  1. 部署 Spark 到 Mesos
  2. 配置每個工做節點  the --no-switch_user flag 或者建立jovyan用戶在每個 slave節點上。
  3. 運行Docker容器,帶參數 --net=host 在全部的Spark Workers都能訪問的網絡位置(查看 Spark networking requirement.)
  4. Follow the language specific instructions below.

In a Python Notebook

  1. 打開 Python 2 或 3 notebook.
  2. 建立 SparkConf 實例,指向 Mesos master node (or Zookeeper instance) 和 Spark 二進制包的位置。
  3. 建立 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

  1. 如上的方法運行一個容器實例。
  2. 打開一個 R notebook。
  3. 初始化 sparkR ,指向Mesos master node (or Zookeeper instance) , Spark 二進制包位置。
  4. 初始化 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))

在Apache Toree (Scala) Notebook

  1. 打開一個終端,經過 New -> Terminal 在notebook 界面上。
  2. 添加關於集羣的信息到 SPARK_OPTS 環境變量,當運行容器時.
  3. 打開一個Apache Toree (Scala) notebook。
  4. 使用預先配置的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

經過Standalone Mode鏈接到 Spark Cluster要求的設置以下:

  1. 確認docker image (檢查 Dockerfile) 和Spark Cluster被部署、運行的是Spark的同一個版本。
  2. Deploy Spark on Standalone Mode.
  3. 運行Docker container 帶參數 --net=host 在Spark workers都能訪問到的網絡位置. (查看 Spark networking requirement.)
  4. 特殊語言的指令與上面Mesos裏提到的徹底同樣, 只是這裏的master url 變成相似於這樣: spark://10.10.10.10:7077

Notebook 選項

你能夠傳入 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_UIDGRANT_SUDO 特徵將不能工做。具體細節查看Docker Options一節。

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

SSL 證書

在這個Docker鏡像中notebook server的配置須要一個 notebook.pem 文件,該文件包含base64編碼的SSL key和SSL 證書。 該文件還包含其餘的證書 (e.g., intermediate 和 root certificates)。

若是你的 key 和 certificate(s) 做爲獨立的文件, 你須要將它們合併成一個 PEM 文件。 做爲可選的方式, 你能夠建立本身的配置和 Docker鏡像,可使用分開的 key 和 certificate 文件。

更多的使用SSL的信息, 參見下面:

Conda 環境設置

缺省的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

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'
})
相關文章
相關標籤/搜索