pyspark 中使用集群未安装的python三方库:加载虚拟python环境
Posted tinstone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyspark 中使用集群未安装的python三方库:加载虚拟python环境相关的知识,希望对你有一定的参考价值。
简介
在使用pyspark运行python代码的过程中,通常遇到集群环境中没有相应的python三方库,即:ImportError: No module named ** ,对于该种情况,通常有两种解决方案:
1. 集群中的python环境安装相应的三方库! 走流程、找运维,贼麻烦
2. 集群未配置python环境,加载虚拟python环境!(重点讲解该方式,用起来贼方便)
未加载库的通常处理方式
使用pyspark过程中,遇到没有相应python库,可以通常有三种处理方法:
1.单一py文件
spark-submit命令中添加 --py-files a.py 即可:
spark-submit \\
--master yarn \\
--deploy-mode cluster \\
--num-executors 40 \\
--queue default \\
--verbose \\
--py-files a.py \\
b.py
2.自建模块或python简单三方库(不含.so文件, 如 jieba)
直接将python相应的模块如(jieba包)打包为zip,然后spark-submit命令中动态加载该模块即可;(本人直接将windows下python环境中site-packages 中的jieba 打包为zip, 然后使用如下提交命令就可以直接使用,注意模块的依赖包)
注意点:
1.模块存在依赖包
2.zip 包文件较大可以先将zip包上传到HDFS中
3.当有多个模块需要引用时,可以使用逗号分隔
spark-submit \\
--master yarn \\
--deploy-mode cluster \\
--num-executors 40 \\
--queue default \\
--verbose \\
--py-files hdfs://xxx/jieba.zip \\
b.py
3.python复杂三方库(含.so 文件,即动态加载库,如numpy、pandas)(本文重点讲解该方法)
加载虚拟环境
1.在任意台机器上安装Anaconda 软件
2.通过Anaconda 创建虚拟Python环境
(尝试过使用virtualenvwrapper 创建虚拟环境,但是在应用时失败了,因此建议直接使用Anaconda)
3.在创建好的Python环境中安装依赖的Python包
4.将整个虚拟Python环境打包为zip,或tar.gz包
进入到虚拟环境下,如/home/hadoop/anaconda3/envs,使用以下命令将虚拟环境进行打包
zip -r conda_env.zip conda_env # 虚拟环境为conda_env, 打包为conda_env.zip 文件
5.提交Pyspark Application,通过 --archives 选项指定 zip 包路径(可以将虚拟环境zip上传到HDFS或某个节点下 ),然后是在cluster、client模式下提交application,示例如下
spark-submit 提交application时主要是添加如下三行conf,对于cluster与client存在差异
--conf spark.yarn.dist.archives=/wang/code/conda_env \\
--conf spark.pyspark.driver.python=/wang/code/conda_env/bin/python \\
--conf spark.pyspark.python=/wang/code/conda_env/bin/python \\
######################## cluster模式
spark-submit \\
--master yarn \\
--deploy-mode cluster \\
--num-executors 50 \\
--queue default \\
--verbose \\
--conf spark.yarn.dist.archives=hdfs:wang/conda_env.zip#python36 \\
--conf spark.pyspark.driver.python=./python36/conda_env/bin/python \\
--conf spark.pyspark.python=./python36/conda_env/bin/python \\
test.py
注意:
1、hdfs:/// 是三条斜杠,之前参考其他资料写的两条斜杠一直报错
2、archives 命令后的 # 是必须的(通常会以为是注释),它指的是将 zip包 临时解压到的文件夹,后续两条--conf命令直接引用该文件夹即可
3、在提交 Pyspark Application 时会将该环境 zip 包上传到运行Application 的所在的每个节点上,并解压缩为Python 代码提供运行环境,如果不想每次都从客户端将该环境文件上传到集群中运行 pyspark application 的节点上,可以采用zip 包上传到HDFS的方式即可
######################## client模式
spark-submit \\
--master yarn \\
--deploy-mode client \\
--driver-memory 2g \\
--num-executors 50 \\
--queue default \\
--verbose \\
--conf spark.yarn.dist.archives=hdfs:wang/conda_env.zip#python36 \\
--conf spark.pyspark.driver.python=/mnt/wang/conda_env/bin/python \\
--conf spark.pyspark.python=./python36/conda_env/bin/python \\
test.py
注意:
1、与cluster主要不同在 --conf spark.pyspark.driver.python
对应的路径为提交application 的节点上解压conda_env.zip 后对应的/bin/python路径,即conda_env.zip 解压后的路径为/mnt/wang/conda_env/ ,然后再加上对应的路径下的 /bin/python,其目的就是集群 driver节点使用的python环境
参考
https://blog.csdn.net/weixin_41002327/article/details/112252163
https://blog.csdn.net/yawei_liu1688/article/details/112304595.
以上是关于pyspark 中使用集群未安装的python三方库:加载虚拟python环境的主要内容,如果未能解决你的问题,请参考以下文章
Python应用实战案例-pyspark库从安装到实战保姆级讲解
无法让 pyspark 作业在 hadoop 集群的所有节点上运行
寻找有关如何使用 python 启动 AWS EMR 集群以运行 pyspark 步骤的示例