PySpark分发Python包至Executor节点遇路径不存在错误求助
问题描述
按照Spark官方文档创建虚拟环境tar包,用于分发至EMR YARN集群的Executor节点,操作步骤如下:
- 创建并激活虚拟环境:
python -m venv pyspark_venv source test_env/bin/activate # 注意:创建的虚拟环境为pyspark_venv,但激活的是test_env,存在名称不匹配的问题 pip install quote venv-pack venv-pack -o test_env.tar.gz
- 通过SCP将tar包上传至EMR主节点后,执行spark-submit命令:
spark-submit \ --master yarn \ --deploy-mode cluster \ --archives test_env.tar.gz#environment \ --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./environment/bin/python \ --conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python \ app_venv.py
已在spark-env.sh中通过export配置Python路径,但任务抛出以下错误:
Caused by: java.io.IOException: Cannot run program "./environment/bin/python": error=2, No such file or directory
环境为EMR集群,使用竞价节点无法手动在所有节点安装依赖,寻求解决方案。
解决方案
1. 修正虚拟环境创建/激活的名称不匹配问题
创建的虚拟环境名称是pyspark_venv,但激活的是test_env,会导致依赖包未安装到目标虚拟环境,打包的tar包内容缺失。修正步骤:
python -m venv pyspark_venv source pyspark_venv/bin/activate pip install quote venv-pack venv-pack -o pyspark_venv.tar.gz
2. 补充Executor节点的Python环境配置
仅配置spark.yarn.appMasterEnv只会覆盖Application Master的Python路径,Executor节点的Python路径未指定,需添加spark.executorEnv.PYSPARK_PYTHON配置:
spark-submit \ --master yarn \ --deploy-mode cluster \ --archives pyspark_venv.tar.gz#environment \ --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./environment/bin/python \ --conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python \ --conf spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python \ app_venv.py
3. 确保虚拟环境与EMR节点系统兼容
- 必须在同架构同系统的Linux机器(如EMR主节点)上创建虚拟环境,避免本地(Mac/Windows)打包的Python二进制文件无法在EMR Linux节点运行。
- 若在本地打包,需指定与EMR节点匹配的Python路径(版本、架构一致):
venv-pack -o pyspark_venv.tar.gz --python=/usr/bin/python3
4. 使用HDFS路径存储虚拟环境包
避免SCP到主节点的路径问题,推荐将tar包上传至HDFS,提交任务时使用HDFS路径:
# 上传tar包到HDFS hdfs dfs -put pyspark_venv.tar.gz /user/hadoop/ # 提交任务 spark-submit \ --master yarn \ --deploy-mode cluster \ --archives hdfs:///user/hadoop/pyspark_venv.tar.gz#environment \ --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./environment/bin/python \ --conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python \ --conf spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python \ app_venv.py
5. 验证tar包内容完整性
解压tar包检查是否存在目标Python文件:
tar -tf pyspark_venv.tar.gz | grep bin/python
若不存在,说明打包过程有误,需重新执行虚拟环境创建和打包步骤。
内容的提问来源于stack exchange,提问作者Sanket Sanath
相关产品推荐
相关产品推荐

