在AWS EMR中提交多文件PySpark作业遇问题求助
解决EMR上多文件PySpark作业模块找不到的问题
核心问题分析
你的问题出在依赖模块的分发方式错误以及Python包结构不完整,导致EMR集群的Worker节点无法找到导入的模块。之前的spark-submit参数配置存在多个误区(比如误用--class、--py-files位置错误、未正确打包项目结构)。
正确解决方案步骤
1. 完善Python包结构
在项目的每个子目录下添加空的__init__.py文件,让Python识别这些目录为可导入的包:
flexible_calendar - Cache - __init__.py - redis_main.py - Helpers - __init__.py - helpers.py - Spark - __init__.py - spark_main.py - main.py
2. 正确打包项目
在flexible_calendar目录的上级目录执行打包命令,确保zip包内保留完整的项目结构:
zip -r flexible_calendar.zip flexible_calendar/
打包完成后,zip包的根目录就是flexible_calendar,包含所有子目录和文件。
3. 上传打包文件到S3
将flexible_calendar.zip上传到你的S3存储桶,比如路径为s3://flexible-calendar/flexible_calendar.zip。
4. 调整main.py的导入语句
修改main.py中的导入逻辑,使用完整的包路径导入模块:
# 替换原来的 import helpers from flexible_calendar.Helpers import helpers # 替换原来的 import redis_main from flexible_calendar.Cache import redis_main # 替换原来的 import spark_main from flexible_calendar.Spark import spark_main
5. 正确的spark-submit命令
使用以下参数提交作业,注意--py-files必须放在主脚本路径之前:
spark-submit --deploy-mode cluster --py-files s3://flexible-calendar/flexible_calendar.zip s3://flexible-calendar/flexible_calendar/main.py
之前配置的错误点说明
- 直接提交多个分散的Python文件:集群模式下Worker节点无法自动同步这些分散的文件,必须通过
--py-files打包分发。 - 误用
--class参数:该参数仅适用于Java/Scala作业,Python作业不需要指定。 --py-files位置错误:必须放在要执行的主脚本之前,否则Spark无法识别该参数。- 缺少
__init__.py:没有该文件,Python无法将子目录识别为可导入的包,导致导入失败。
内容的提问来源于stack exchange,提问作者Daniel Avigdor
相关产品推荐
相关产品推荐

