jupyter notebook + pyspark 環境搭建


安裝並啟動jupyter

安裝 Anaconda 后, 再安裝 jupyter
pip install jupyter

設置環境
ipython --ipython-dir= # override the default IPYTHONDIR directory, ~/.ipython/ by default
ipython profile create foo # create the profile foo
ipython profile locate foo # find foo profile directory, IPYTHONDIR by default,
ipython --profile=foo # start IPython using the new profile

啟動jupyter的幾個命令, 啟動后, 默認還將啟動一個瀏覽器進入 notebook 環境
ipython notebook # 啟動 jupyter notebook服務器, 使用默認端口8080
ipython notebook --ip=0.0.0.0 --port=80 # 啟動 jupyter notebook服務器, 指定端口
ipython notebook --profile=foo # 使用 foo profile 啟動 jupyter notebook服務器
ipython notebook --pylab inline # 啟用 PyLab graphing support
ipython notebook 是老版本的命令組合, 新版是jupyter notebook命令組合, 如果使用Anaconda的發布包, 直接使用jupyter-notebook這個工具.

更多jupyter使用信息, 見
http://nbviewer.jupyter.org/github/ipython/ipython/blob/3.x/examples/Notebook/Notebook Basics.ipynb

定制Jupyter

[root#]./jupyter-notebook --generate-config
將生成一個jupyter的配置文件, 比如 /root/.jupyter/jupyter_notebook_config.py , 在其中可配置Notebook App的基本信息
文件名為: /root/.jupyter/jupyter_notebook_config.py

c = get_config()
c.IPKernelApp.pylab = 'inline'
c.NoteBookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8880 # or whatever you want

為 notebook 的 cell增加line number

在 ~/.ipython/profile_foo/static/custom/custom.js 增加下面幾行

define([
    'base/js/namespace',
    'base/js/events'
    ], 
    function(IPython, events) {
        events.on("app_initialized.NotebookApp", 
            function () {
                require("notebook/js/cell").Cell.options_default.cm_config.lineNumbers = true;
            }
        );
    }
);

更改jupyter的主題

https://github.com/transcranial/jupyter-themer
更改命令
jupyter-themer -c monokai

訪問遠端的notebook server

如果是在遠端開啟了notebook server, 在本機瀏覽器直接訪問, 將不能打開, 這應該是notebook server為安全考慮, 有意屏蔽非本機的訪問. 當然, 我們總不能一直通過x-windows到遠端打開瀏覽器使用notebook吧.
1.最簡單的做法是,啟動notebook sever時, 加上參數--ip=0.0.0.0, 即:
./jupyter-notebook --port=7777 --ip=0.0.0.0
2.另一個方法是:在本機使用ssh軟件建立一個連接遠端的ssh tunnel, 本機瀏覽器通過ssh tunnel就可以訪問遠端的notebook server. 比如, 我習慣使用putty, 方法是:
putty-> Connection > SSH > Tunnels
Under Add new forwarded port:, enter the following information:
Source port: local_port
Destination: remote_host:remote_port
Click Add.然后, 使用這個配置ssh連接遠端server.

訪問遠端的ipython

jupyter是使用tab能進行代碼補全, 但在瀏覽器中有時並不起作用, 使用遠端的ipython就沒有這個問題, 當然ipython在EDA(探索式數據分析)文檔化方面比notebook弱多了, 魚和熊掌不能皆得. 我更喜歡ipython qtconsole方式.
連接遠端ipython的步驟:

  1. 遠端開啟ipython host, 命令為 ./ipython kernel -f ~/ipython-connect-info.json # 這是一個沒有前端的ipython進程.
  2. 將遠端的 ipython-connect-info.json 文件復制到本機, 修改其中的ip地址為遠端真實的地址
  3. 本機上使用putty為 ipython-connect-info.json 文件中的5個port都開啟ssh tunnel
  4. 本機執行 ipython qtconsole --existing c:\ipython-connect-info.json

與PySpark集成

IPython和普通的Python interpreter相比, 優點在於對交互性支持更好, 所以PySpark只有在需要更好交互性的情形下, 才有集成IPython的必要, 顯然只有 pyspark shell 才需要集成IPython.
Jupyter和PySpark shell集成方式有好幾種, 比如:

  1. 先啟動IPython, 然后調用pyspark\shell.py啟動spark.
    啟動IPython后, 我們可以手動調用pyspark\shell.py, 將調用腳本加到IPython profile目錄中自動啟動, 自動啟動python程序. 調用pyspark\shell.py應放在文件 ~/.ipython/profile_foo/startup/00-pyspark-setup.py 中.
    00-pyspark-setup.py的寫法可參考 https://github.com/harisekhon/pytools/blob/master/.ipython-notebook-pyspark.00-pyspark-setup.py

  2. 采用IPython 這個高級 interpreter 來啟動pyspark

例子1, 在 spark master server 上以notebook的形式啟動 pyspark shell. 如果指定 --master 參數, 必須首先通過 start-master.sh啟動 master; 如果省略該參數, 則會pyspark會自動啟動master進程.
spark_master_node$ PYSPARK_DRIVER_PYTHON=/usr/python_anaconda/bin/ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --ip=0.0.0.0 --port=7777" pyspark --master spark://quickstart.cloudera:7077

例子2, 在 spark master server 上以ipython kernel的形式啟動 pyspark shell, 以便其他機器連入
spark_master_node$ PYSPARK_DRIVER_PYTHON=/usr/python_anaconda/bin/ipython PYSPARK_DRIVER_PYTHON_OPTS="kernel -f ~/ipython-connect-info.json" pyspark --master spark://quickstart.cloudera:7077

例子3, 在 spark master server 上以notebook的形式啟動 pyspark shell, 並加載額外的package, 指定內存參數.
spark_master_node$ PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port=7777 --profile=foo" pyspark --packages com.databricks:spark-csv_2.10:1.1.0 --master spark://spark_master_hostname:7077 --executor-memory 6400M --driver-memory 6400M

設置 PYSPARK_DRIVER_PYTHONPYSPARK_DRIVER_PYTHON_OPTS 環境變量后, 之后調用pyspark將采用這兩個環境變量指定的Python 解釋器配置來運行python 版spark 應用.
注意不應該export 這兩個環境變量, 因為export后, 非shell的pyspark spark應用也將使用IPython運行, 容易造成濫用.
雖然我不推薦在Linux profile將 PYSPARK_DRIVER_PYTHON 設置為IPython, 但我推薦將 PYSPARK_DRIVER_PYTHON 設置為 Anaconda的 python, 因為這將省去安裝額外科學計算包的麻煩, 當然, 環境變量PYSPARK_DRIVER_PYTHON_OPTS不應該再帶上notebook或kernel參數.

最好在 spark-env.sh 增加下面4個參數,

worker和driver 的python版本應該是一致的, 否則spark會報錯的, 當然driver可以設置為ipython.

export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=/usr/bin/ipython3

為了簡化提交pyspark 應用的提交,可以預先設置一個 PYSPARK_SUBMIT_ARGS 環境變量.

export PYSPARK_SUBMIT_ARGS='--master local[2]'
export PYSPARK_SUBMIT_ARGS='--master yarn --deploy-mode client --num-executors 24 --executor-memory 10g --executor-cores 5'

參考文章

How-to: Use IPython Notebook with Apache Spark
http://www.tuicool.com/articles/rqIv6z
http://blog.cloudera.com/blog/2014/08/how-to-use-ipython-notebook-with
How to Install PySpark and Integrate with IPython Notebook
https://www.dataquest.io/blog/installing-pyspark/
http://www.tuicool.com/articles/VFn6j2Y
Configuring IPython Notebook Support for PySpark
http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/
Using Jupyter on Apache Spark: Step-by-Step with a Terabyte of Reddit Data
http://blog.insightdatalabs.com/jupyter-on-apache-spark-step-by-step/
如何自定義jupyter notebook的主題
http://www.cnblogs.com/wybert/p/5030697.html
jupyter cell 增加 line number
https://stackoverflow.com/questions/20197471/how-to-display-line-numbers-in-ipython-notebook-code-cell-by-default/20197878
Spark編程環境搭建(IPython)
http://www.kinelf.com/?p=169
如何使用Docker快速配置數據科學開發環境(搭建Docker + Jupyter環境 )
https://linux.cn/article-6644-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM