如何基于Conda将含依赖的PySpark项目部署到EMR并管理依赖?
PySpark项目带依赖部署到EMR的实操方案
一、本地打包带依赖的项目
1. pip wheel打包(纯Python依赖场景)
适合仅用PyPI包的项目,和你之前的Maven打包逻辑最接近:
- 项目根目录创建
pyproject.toml,声明项目信息和依赖(注意PySpark版本要和EMR集群匹配):
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-pyspark-project" version = "0.1.0" dependencies = [ "pyspark==3.3.0", "pandas==1.5.3", # 其他自定义依赖 ]
- 执行打包命令,生成项目wheel包和依赖包:
pip install build python -m build --wheel pip download -r requirements.txt -d deps/
- 将项目wheel、deps目录、核心PySpark脚本打包成zip:
zip -r project-bundle.zip your-project.whl deps/ main_script.py
2. conda-pack打包(含非Python依赖场景)
如果项目用到Conda管理的编译型库(比如GDAL、NumPy的MKL版本),用这个方法打包整个环境:
- 激活本地Conda环境:
conda activate your-pyspark-env
- 安装conda-pack并打包环境:
conda install -c conda-forge conda-pack conda-pack -o env.tar.gz
- 打包环境包和脚本为zip:
zip -r project-bundle.zip env.tar.gz main_script.py
二、S3上传与EMR Step运行
针对pip wheel包的运行命令
将project-bundle.zip上传到S3路径(比如s3://your-bucket/pyspark/bundles/),然后提交EMR Step时用以下Spark Submit命令:
spark-submit \ --deploy-mode cluster \ --py-files s3://your-bucket/pyspark/bundles/project-bundle.zip \ s3://your-bucket/pyspark/scripts/main_script.py
Spark会自动解压zip中的依赖,在执行时加载。
针对conda-pack环境的运行命令
需要先在EMR节点上解压conda环境,可通过Bootstrap Action实现:
- 创建
bootstrap-env.sh脚本:
#!/bin/bash mkdir -p /mnt/emr/conda-env aws s3 cp s3://your-bucket/pyspark/bundles/env.tar.gz /mnt/emr/conda-env/ cd /mnt/emr/conda-env && tar xzf env.tar.gz
- 将脚本上传到S3,创建EMR集群时添加为Bootstrap Action
- 提交EMR Step时指定Python路径:
spark-submit \ --deploy-mode cluster \ --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=/mnt/emr/conda-env/bin/python \ --conf spark.executorEnv.PYSPARK_PYTHON=/mnt/emr/conda-env/bin/python \ s3://your-bucket/pyspark/scripts/main_script.py
三、依赖更新流程
和你之前Scala-Maven的流程完全对应,步骤如下:
- 本地环境安装新增依赖:
conda install new-package或pip install new-package - 更新
pyproject.toml或requirements.txt的依赖列表 - 重新打包生成新的
project-bundle.zip(对应之前的打包方式) - 上传新zip到S3覆盖旧文件
- 提交新的EMR Step即可,无需重建集群(除非依赖是系统级库,需更新Bootstrap脚本)
关键注意事项
- 本地PySpark版本必须和EMR集群的Spark版本一致,避免API兼容问题
- conda-pack打包时,确保本地环境架构与EMR节点一致(比如都是x86_64,不要用M1 Mac打包x86集群)
- 大型通用依赖(如pandas、numpy)可直接用EMR预装版本,仅打包项目专属依赖,减少包体积
内容的提问来源于stack exchange,提问作者Avijit
相关产品推荐
相关产品推荐

