AWS EMR v5.32.0 Bootstrap执行时Numpy旧版本无法卸载导致pandas导入失败
版本残留的核心原因是EMR预装的Numpy同时存在RPM安装包和pip安装包,且不同用户(root/emr-user)、不同Python版本的包路径独立,仅执行单轮pip卸载无法覆盖所有安装来源,可按以下步骤处理:
第一步:优先卸载系统预装的RPM版本Numpy
在Bootstrap脚本最开头添加如下命令,移除yum源安装的默认Numpy,这类包无法通过pip卸载:sudo yum remove -y python3-numpy python-numpy第二步:全路径清理pip安装的旧版本Numpy
分别清理root用户和普通用户路径下的旧版本,指定Python3对应的pip工具避免操作到Python2的包:sudo pip3 uninstall -y numpy==1.16.* pip3 uninstall -y numpy==1.16.* # 多次执行确保所有旧版本被完全卸载 sudo pip3 uninstall -y numpy pip3 uninstall -y numpy第三步:安装目标版本依赖
清理完成后统一安装符合要求的Numpy和pandas版本:sudo pip3 install numpy==1.21.6 pandas>=1.0.0第四步:配置Python路径优先级,避免旧路径优先被读取
在Bootstrap中添加全局环境变量配置,将pip第三方包路径放到系统默认路径之前:sudo sh -c "echo 'export PATH=/usr/local/bin:\$PATH' >> /etc/profile.d/custom-python.sh" sudo sh -c "echo 'export PYTHONPATH=/usr/local/lib/python3.7/site-packages:\$PYTHONPATH' >> /etc/profile.d/custom-python.sh" sudo chmod +x /etc/profile.d/custom-python.sh source /etc/profile.d/custom-python.sh第五步:适配PySpark场景(如果使用Spark任务)
如果集群运行PySpark任务,需要在集群配置中指定统一的Python3路径,避免Executor节点读取到旧版本Numpy:spark.executorEnv.PYSPARK_PYTHON=/usr/bin/python3 spark.yarn.appMasterEnv.PYSPARK_PYTHON=/usr/bin/python3第六步:添加验证步骤
在Bootstrap脚本末尾添加验证逻辑,确保部署时就能检测到版本异常:python3 -c "import numpy; import pandas; print('Numpy版本:', numpy.__version__, 'Pandas版本:', pandas.__version__)"
注意:Bootstrap脚本默认以root身份执行,若需要为emr-user单独配置环境,所有非全局的pip操作需要切换到emr-user身份执行
内容的提问来源于stack exchange,提问作者Mihir Garg

