文章目录
- 背景
- conda创建环境并zip打包
- 上传zip包到hdfs
- spark-submit提交参数设置
- 参考
背景
在使用PySpark进行开发时,面临的痛点问题之一是Driver或Executor上运行Python的包依赖的问题,解决办法之一是可以通过Conda创建环境解决Python包依赖的问题,具体为在本地机器打包Conda创建的运行环境为zip包,然后zip包上传hdfs,然后在spark-submit提交命令中添加archives
和spark.pyspark.python
参数的方式解决。
conda创建环境并zip打包
Miniconda下载:https://conda.io/en/latest/miniconda.html
由于conda将几乎所有的工具、第三方包都当做package对待,甚至包括python和conda自身!因此,conda打破了包管理与环境管理的约束,能非常方便地安装各种版本python、各种package并方便地切换。因此对于下载anaconda2还是3版本都无所谓,因为可以自己通过conda创任意版本的环境。
下载安装完成后,建议每个运行Python环境单独创建一个新的Python环境,这样只需要安装需要到的依赖包,避免最后依赖包过大。
例如新建一个scoenv
的python3.6环境:
# 添加conda的TUNA镜像,并设置搜索时显示通道地址
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
# 创建一个Python3.6环境
conda create --name scoenv python=3.6
# 激活进入环境
source activate scoenv
# 安装各种依赖包,比如requests、numpy、scipy、scikit-learn等等
pip install requests==2.25.1
# 查看已安装的依赖包
pip list
创建环境并安装相应依赖包后,整个环境已经生成了,环境默认在 ~/miniconda3/envs/所装环境名
下,然后进入该目录下进行打包即可。
例如:
# 进入目录
cd ~/miniconda3/envs
# 打包为zip
zip -r scoenv.zip scoenv/
注:Conda会把运行环境所需的c库都放在创建环境名下的lib目录,因此不会出现丢失共享库的错误信息,但是由于依赖包安装会有编译过程,尽量保证相互拷贝的机器环境一致,避免机器环境不同导致的出错。
上传zip包到hdfs
由于打包的Python运行环境zip包一般比较大,可以先上传hdfs,然后再使用PySpark代码处指定hdfs路径,避免每次都从本地上传。
# 上传
hadoop fs -put scoenv.zip hdfs:/user/xx/xx/
spark-submit提交参数设置
在PySpark上用指定的环境运行,在提交作业前加上如下参数即可:
# 环境包地址最好放在hdfs集群上,免得上传;#scoenv不能缺少,是在AppMaster上解压zip后的文件名
--archives hdfs:/user/xx/xx//scoenv.zip#scoenv
# 指定Driver或Executor使用的Python路径,其中第一个scoenv是zip解压后的文件名,第二个scoenv是打包的环境名
--conf spark.pyspark.python=./scoenv/scoenv/bin/python3.6
使用的spark-submit提交命令参考:
spark-submit --master yarn \
--deploy-mode cluster \
--num-executors=8 \
--executor-memory=10g \
--executor-cores=2 \
--driver-memory=4g \
--conf spark.pyspark.python=./scoenv/scoenv/bin/python3.6 \
--archives hdfs:/user/xx/xx//scoenv.zip#scoenv \
--py-files demo.zip spark_driver.py xxx
参考
PySpark依赖部署0483-如何指定PySpark的Python运行环境