AWS EMR集群中PySpark无法识别已安装的boto3依赖包怎么办?
解决EMR PySpark中找不到boto3模块的问题
核心原因
EMR集群里Spark的Python运行环境,和你通过引导操作安装boto3的环境不匹配,导致PySpark加载不到已安装的模块。
具体解决办法
1. 对齐PySpark的Python路径与安装路径
先在EMR主节点执行命令,确认Spark实际使用的Python路径:
spark-submit --version | grep Python
或者启动Spark Shell后执行:
import sys print(sys.executable)
拿到路径后,用这个路径对应的pip来安装boto3,比如路径是/usr/bin/python3,引导操作命令改成:
sudo /usr/bin/python3 -m ensurepip --upgrade sudo /usr/bin/python3 -m pip install boto3==1.24.83
2. 统一配置Driver和Executor的Python环境
只设置spark.pyspark.python可能不够,需要同时指定Driver端的Python路径。可以在EMR集群配置里添加以下内容:
[ { "Classification": "spark-env", "Configurations": [ { "Classification": "export", "Properties": { "PYSPARK_PYTHON": "/usr/bin/python3", "PYSPARK_DRIVER_PYTHON": "/usr/bin/python3" } } ] }, { "Classification": "spark-defaults", "Properties": { "spark.pyspark.python": "/usr/bin/python3", "spark.pyspark.driver.python": "/usr/bin/python3" } } ]
或者在提交应用时通过spark-submit参数直接指定:
spark-submit --conf spark.pyspark.python=/usr/bin/python3 --conf spark.pyspark.driver.python=/usr/bin/python3 your_app.whl
3. 确认引导操作覆盖所有节点
EMR的引导操作默认会在所有节点(主节点、核心节点、任务节点)执行,但如果你的配置只针对主节点,Executor所在的节点就会缺失boto3。检查引导操作的执行范围,确保是集群所有节点。
4. 备选:把boto3打包进wheel包
如果环境对齐的方式行不通,可以修改wheel包的构建配置,将boto3纳入依赖打包。比如在setup.py里添加:
setup( # 其他配置项 install_requires=[ 'boto3==1.24.83', # 你的其他依赖 ] )
这样PySpark运行时会直接从wheel包加载boto3,不需要依赖集群环境。
内容的提问来源于stack exchange,提问作者Liu Piu
相关产品推荐
相关产品推荐

