PySpark EMR任务报错:找不到psycopg2._psycopg模块
我之前在EMR上跑PySpark任务时也碰到过一模一样的问题,给你梳理下原因和可行的解决办法:
问题根源
这个报错的核心原因是psycopg2包含C语言编写的底层扩展模块。你在本地用python -m pip install -t安装的psycopg2,是针对你本地操作系统/硬件架构编译的版本,而EMR集群的节点(通常是Amazon Linux 2或Amazon Linux 2023)和你的本地环境不兼容,导致集群节点无法加载编译后的_psycopg模块,所以抛出了导入错误。而SQLAlchemy是纯Python库,没有依赖编译后的二进制文件,所以能正常导入。
解决方案1:在与EMR匹配的环境中编译psycopg2并打包
这是最直接的适配方案:
- 启动一台和你的EMR集群同版本的EC2实例(比如EMR用Amazon Linux 2,就选对应的AMI)
- 在这台实例上安装Python、pip,然后执行你原来的打包命令:
python -m pip install -t build/dependencies -r src/requirements.txt - 把生成的
build/dependencies目录打包成zip,上传到S3后,再传给spark-submit的--py-files参数 - 这样打包出来的psycopg2是针对EMR节点环境编译的,就能正常加载
_psycopg模块了
解决方案2:用EMR Bootstrap Action在集群启动时安装psycopg2
如果不想折腾跨环境打包,可以让EMR在集群启动时自动安装适配的psycopg2:
- 创建一个名为
install_psycopg2.sh的bootstrap脚本:#!/bin/bash # 安装编译依赖 sudo yum install -y postgresql-devel python3-devel gcc # 安装psycopg2(用binary版本跳过本地编译,更快) sudo pip3 install psycopg2-binary - 把这个脚本上传到S3,然后在创建EMR集群时,添加Bootstrap Action,指定这个脚本的S3路径
- 集群每个节点启动时都会自动安装适配本地环境的psycopg2,你的Spark任务直接导入即可,不需要把它打包进
--py-files的依赖zip里
解决方案3:改用纯Python的PostgreSQL驱动(备选)
如果不想处理编译和环境兼容的问题,可以试试纯Python实现的PostgreSQL驱动pg8000:
- 修改你的
requirements.txt,把psycopg2替换成pg8000 - 调整代码里的数据库连接字符串:把
postgresql+psycopg2://user:pass@host/db改成postgresql+pg8000://user:pass@host/db - 这样打包依赖时,直接在本地执行原命令即可,因为pg8000是纯Python库,没有环境兼容问题,能直接在EMR上运行
内容的提问来源于stack exchange,提问作者lfk
相关产品推荐
相关产品推荐

