通过Bootstrap Actions在EMR安装Python包,Jupyter Notebook无法正常加载
EMR 6.3.1 Jupyter Notebook 依赖版本不匹配问题解决方案
问题核心分析
EMR 6.3.1 的 Jupyter Notebook 默认使用隔离虚拟环境(/emr/notebook-env),该环境预安装了 pandas 1.2.3 等包;而你的 Bootstrap 脚本是将依赖安装到了系统级 Python 路径(/usr/local/lib64/python3.7/site-packages)。由于 Notebook 的 sys.path 优先级高于系统路径,导致始终加载旧版本依赖,且无法找到系统路径下的 pyarrow。
可行解决方案
方案一:直接安装到 Notebook 隔离环境(推荐)
修改 Bootstrap 脚本,使用 Notebook 环境自带的 pip 执行安装,确保依赖直接进入 emr/notebook-env:
#!/bin/bash # 调用Notebook环境的pip安装指定版本依赖 sudo /emr/notebook-env/bin/pip install Cython==0.29.4 boto==2.49.0 boto3==1.18.50 numpy==1.19.5 pandas==1.3.2 pyarrow==5.0.0
方案二:修改 Jupyter 配置,提升系统路径优先级
通过配置让 Notebook 优先加载系统路径下的依赖:
- SSH 登录 EMR 主节点,切换到
emr-notebook用户:sudo su emr-notebook - 生成并编辑 Jupyter 配置文件:
jupyter notebook --generate-config vi ~/.jupyter/jupyter_notebook_config.py - 在配置文件末尾添加以下内容,将系统路径插入到
sys.path首位:c.InteractiveShellApp.exec_lines = [ 'import sys; sys.path.insert(0, "/usr/local/lib64/python3.7/site-packages")' ] - 重启 Jupyter 服务:
sudo systemctl restart jupyter-server
方案三:Notebook 内临时调整路径(适合快速测试)
每次打开 Notebook 后先执行以下代码,强制优先加载系统路径的依赖:
import sys import importlib # 将系统路径插入到sys.path最前面 sys.path.insert(0, "/usr/local/lib64/python3.7/site-packages") # 重新导入并刷新pandas import pandas importlib.reload(pandas) print(pandas.__version__) # 应显示1.3.2 import pyarrow # 可正常导入
补充说明
之前尝试的方法无效原因:
--user参数:依赖安装到用户目录(/home/emr-notebook/.local/lib/python3.7/site-packages),优先级仍低于emr/notebook-env- 设置
PYTHONPATH后安装:Bootstrap 阶段的环境变量不会传递给 Jupyter 的运行环境 - pyspark 内核:该内核使用 Spark 独立的 Python 环境,与 Jupyter Notebook 的隔离环境无关联
内容的提问来源于stack exchange,提问作者bravinator932421
相关产品推荐
相关产品推荐

