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环境的主要内容,如果未能解决你的问题,请参考以下文章

如何访问安装在 hdfs 头节点集群内的 pyspark

Python应用实战案例-pyspark库从安装到实战保姆级讲解

无法让 pyspark 作业在 hadoop 集群的所有节点上运行

寻找有关如何使用 python 启动 AWS EMR 集群以运行 pyspark 步骤的示例

如何添加第三方 Java JAR 文件以在 PySpark 中使用

Spark集群 Python Package管理