AWS EMR已安装boto3仍报No module named 'boto3'错误排查
问题根因
pip list能查到boto3但作业仍报ModuleNotFoundError,核心原因是Python环境不匹配,和包是否安装无关:
- 手动在主节点执行pip安装,依赖只装在了主节点,EMR的计算步骤会分发到所有core/任务节点运行,worker节点没有对应依赖自然导包失败
- 安装依赖的Python解释器路径,和EMR步骤、Spark作业实际调用的Python解释器路径不一致,你装的包不在作业的Python搜索路径里
- 依赖版本存在冲突:你requirements指定boto31.16.34、botocore1.19.63,但实际安装结果是boto3 1.24.20、botocore 1.19.52,版本不匹配也会触发导入异常
解决步骤
- 不要手动在主节点单独装依赖,通过EMR引导操作(Bootstrap Action)统一给所有节点安装依赖:编写安装脚本,在集群启动阶段自动在所有节点执行,脚本内容参考:
#!/bin/bash # 先从公共存储路径下载你的requirements.txt到节点本地,比如存放在S3的话提前用aws s3 cp拉取 aws s3 cp s3://你的依赖存储路径/requirements.txt /tmp/requirements.txt sudo pip-3.7 --default-timeout=60 install --force-reinstall -r /tmp/requirements.txt
- 强制指定作业使用的Python解释器路径,避免路径错位:如果是提交PySpark作业,在提交参数里加以下配置,明确指定使用安装了依赖的Python3.7:
--conf spark.pyspark.python=/usr/bin/python3.7 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=/usr/bin/python3.7 --conf spark.executorEnv.PYSPARK_PYTHON=/usr/bin/python3.7
如果是运行普通Shell类型的EMR步骤,在脚本开头提前声明环境变量:
export PYSPARK_PYTHON=/usr/bin/python3.7 export PYTHONPATH=/usr/lib/python3.7/site-packages:$PYTHONPATH
- 装完依赖不要只靠
pip list验证,直接用对应Python解释器执行导入测试,确认包可用:
/usr/bin/python3.7 -c "import boto3; print(boto3.__version__)"
命令正常返回boto3版本号才算安装到位。
- 修复权限问题:sudo安装的包默认权限属于root,EMR作业默认用hadoop/yarn用户运行,如果没有site-packages的读权限也会导包失败,安装完成后执行:
sudo chmod -R 755 /usr/lib/python3.7/site-packages/
- 对齐boto3和botocore版本,避免版本冲突:单独执行强制重装命令,把两个包的版本和requirements里指定的对齐:
sudo pip-3.7 install --force-reinstall boto3==1.16.34 botocore==1.19.63
内容的提问来源于stack exchange,提问作者Sarat Kota
相关产品推荐
相关产品推荐

