最近一直在用pyspark开发大数据项目,但每次报错都要重新提交spark-submit执行任务,效率实低,在网上搜索发现能够配置jupyter实现spark交互,测试了一下,真是相见恨晚!
现有环境:
系统:linux;
集群:多结点大数据集群;
整个过程的操纵步骤:
下载anaconda——配置jupyter——配置环境信息!done。
因为spark集群中自带的python是python2,所以为了方便,建议用python2。(不然每个结点都需要配置python,麻烦都一批)
因为已经存在大数据集群,直接进行anaconda安装。
一、安装anaconda+配置jupyter
在一个结点的服务器上安装anaconda,过程可直接参考我的另一篇文章:linux 安装anaconda与jupyter notebook配置
!!!有两种方法:一种是中环境变量中配置信息(二);另一种是不配置,在提交命令时直接定义(三)。
二、配置环境信息
要定义的信息主要有:SPARK_HOME、PYTHONPATH、py4j路径PYSPARK_PYTHON、PYSPARK_DRIVER_PYTHON、PYSPARK_DRIVER_PYTHON_OPTS
先看一下完整的路径信息,后面再逐一解释。
进入到ananconda的安装目录下,修改/.bashrc文件
vim ~/.bashrc
修改配置如下信息
export SPARK_HOME=/opt/cloudera/parcels/SPARK2/lib/spark2
export PYTHONPATH=/opt/cloudera/parcels/SPARK2/lib/spark2/python:$PYTHONPATH #pythonpath指向spark目录下的python文件夹
export PYTHONPATH=/opt/cloudera/parcels/SPARK2/lib/spark2/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH # 指向py4j包,没有的话下载一个
export PYSPARK_PYTHON=python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
保存配置信息
source ~/.bashrc
验证:在终端输入pyspark
,若打开了对应的jupyter,则配置成功。(在打开后界面会给出对应的端口信息)
详细配置信息
SPARK_HOME
SPARK_HOME对应集群中的spark路径,注意,要确保路径的精准。在最后一个目录下用ls查看,确保有python文件夹,不然的话会出现报错。
一开始我定义的路径:
export SPARK_HOME=/opt/cloudera/parcels/SPARK2
这个路径信息是我在提交spark-submit的路径信息,但一直会报错:.../pyspark:行24:/opt/cloudera/parcels/SPARK2/bin/load-spark-env.sh: 没有那个文件或目录 .../pyspark:行77: /opt/cloudera/parcels/SPARK2/bin/spark-submit: 没有那个文件或目录
正确的路径:export SPARK_HOME=/opt/cloudera/parcels/SPARK2/lib/spark2
这里的spark2路径下有python 文件。
PYTHONPATH
PYTHONPATH对应在集群上进行任务时用户计算的python,我选择的时集群中自带的python。
PYTHONPATH=/opt/cloudera/parcels/SPARK2/lib/spark2/python:$PYTHONPATH #pythonpath指向spark目录下的python文件夹
py4j
选择上述步骤中python中的py4j
export PYTHONPATH=/opt/cloudera/parcels/SPARK2/lib/spark2/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH # 指向py4j包,没有的话下载一个
PYSPARK_PYTHON
PYSPARK_PYTHON定义的是调用pyspark的时候选择的python,这里的python版本要和集群的python版本一致。
PYSPARK_PYTHON=python
PYSPARK_DRIVER_PYTHON,PYSPARK_DRIVER_PYTHON_OPTS
这两项是定义使用jupyter交互的关键!
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS="notebook"
在安装过程中的报错
一开始我安装的是anaconda3,对应的是python3.6,出现了如下报错
Exception: Python in worker has different version 2.7 than that in driver 3.6, PySpark cannot run with different minor versions.Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.
错误原因是jupyter中python的版本是3.6,但集群中python版本是2.7,我在anaconda中又重新安装了一个python2.7的环境,并建立对应的jupyter kernel,运行成功。但考虑到修改的复杂性,建议一开始直接下载anaconda2,但如果集群上是python3,那另说。
docker中有现成的镜像可用,暂时还未研究。
提交资源定义
在完成上述的安装任务后,直接中终端中输入:pyspark
即可打开jupyter。此时的jupyter类似在终端启的一个pyspark-shell ,所以在启用jupyter时可以定义任务资源,例如:
nohub pyspark --master yarn --deploy-mode client --driver-memory 20g --driver-cores 1 --num-executors 10 --executor-memory 6g --executor-cores 1 --conf spark.yarn.executor.memoryOverhead=8192 --conf spark.default.parallelism=800 &
"nohup"是定义在终端关闭后,jupyter程序仍在运行(常规的jupyter任务也可以用,很强大的功能);后面是定义的资源大小,可根据实际的情况配置。
关闭nohup进程
若想要关闭nohup jupyter,可以执行以下操作:
#查看进程
1.ps -aux | grep jupyter
#结束进程
2.kill -9 xxxx(进程号)
三、在命令行定义信息
如果没有配置jupyter的环境变量信息,进入到./pyspark所在目录执行以下信息。
1.本地启动
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook --allow-root" ./pyspark # 其中--allow-root是因为root登录master
2.YARN-client模式运行
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook --allow-root" MASTER=yarn-client ./pyspark
3.Spark Stand Alone 模式运行
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS="notebook --allow-root" MASTER=spark://192.168.XXX:7077 ./pyspark --num-executors 1 --total-executor-cores 2 --executor-memory 512m
OK!
最后,非常好的参考文档:
jupyter notebook+Spark配置远程登录服务器
How to install PySpark and Jupyter Notebook in 3 Minutes
Apache Spark in Python: Beginner’s Guide
https://www.cnblogs.com/zenan/p/9585402.html