如何在AWS EMR Serverless上运行含依赖的多模块Python项目
多模块Python项目适配AWS EMR Serverless打包方案
一、先明确EMR Serverless支持的文件类型
- 单个
.py脚本 - ZIP压缩包:多模块项目首选,能打包所有代码和依赖
- Python Wheel包:适合封装成可安装的标准包
二、打包多模块项目的实操步骤
1. 先理清楚项目结构
确保结构清晰,比如:
my_project/ ├── main.py # EMR要执行的主入口脚本 ├── my_modules/ # 你的自定义模块目录 │ ├── __init__.py │ ├── module_a.py │ └── module_b.py └── requirements.txt # 依赖清单
2. 把依赖装到项目目录里
用pip把所有依赖安装到项目内的lib文件夹,避免打包系统自带库:
pip install -r requirements.txt -t ./lib
划重点:如果依赖有原生扩展(比如numpy、pandas),一定要在Amazon Linux 2环境下安装(比如用EC2或者Docker模拟),不然放到EMR Serverless上会跑不起来。
3. 打包成ZIP包
把项目所有内容(包括自定义模块、lib、main.py、requirements.txt)打包成ZIP:
zip -r my_project.zip my_project/
注意:ZIP根目录要直接是
main.py、my_modules这些文件/文件夹,别把外层的my_project目录也包进去,不然EMR找不到入口。
4. 上传到S3
把打好的ZIP传到你的S3桶里:
aws s3 cp my_project.zip s3://your-bucket/emr-jobs/
三、在EMR Serverless上运行的配置
创建作业时注意这几个关键配置:
- 作业指定的文件路径:填S3上的ZIP包路径,比如
s3://your-bucket/emr-jobs/my_project.zip - 主脚本路径:填ZIP根目录下的入口文件,比如
main.py - Python路径配置:要么在作业的Python设置里把
./lib加到PYTHONPATH,要么在main.py开头加这段代码:
import sys sys.path.insert(0, './lib')
四、另一种方案:打包成单个可执行文件
如果非要单个文件,用PyInstaller,但必须满足:
- 必须在Amazon Linux 2环境下打包,不然生成的可执行文件在EMR上跑不了
- 打包命令参考:
pyinstaller --onefile main.py --add-data "my_modules/:my_modules"
- 把生成的
dist/main可执行文件传到S3,EMR作业直接指定这个文件路径就能运行
内容的提问来源于stack exchange,提问作者nirkov
相关产品推荐
相关产品推荐

