Spark-Submit使用--py-files提交Zip包时模块导入失败问题排查
解决Spark Submit导入模块失败(ImportError: No module named src.main.com.sss.app1.utils.DBUtils)
以下是排查和解决该问题的具体步骤:
检查Zip包的顶层目录结构
解压project1.zip,确认顶层目录是project1还是直接包含src、configs等子目录:- 如果顶层是
project1,那么你的导入语句需要带上project1前缀,比如from project1.src.main.com.sss.app1.utils import DBUtils,因为Spark会将Zip包的顶层目录添加到Python路径中,而非其下的子目录。 - 若想保留
src.main...的导入方式,需要重新打包,将src、configs等目录作为Zip包的顶层,而非嵌套在project1下。
- 如果顶层是
补全所有层级的
__init__.py文件
Python识别包需要每个层级目录都有__init__.py(空文件即可),除了jobs、models、utils,你还需要在src、main、com、sss、app1这些目录下添加该文件,确保整个路径都是合法的Python包结构。调整Spark Submit命令的路径参数
- 确保
main.py的路径正确:如果main.py在project1/src/main/com/sss/app1/目录下,执行命令时需要指定正确的相对/绝对路径,比如:spark-submit --queue fmoapp-queue --py-files project1.zip project1/src/main/com/sss/app1/main.py - 或者将
main.py也打包到Zip包内,直接通过包路径调用。
- 确保
验证Python路径配置
在main.py的开头添加代码打印Python路径,确认project1.zip是否被正确加载:import sys print("当前Python路径:", sys.path)执行后查看输出,若
project1.zip不在路径中,说明--py-files参数未生效,可检查参数拼写或Zip包路径是否正确。避免相对路径导入的歧义
若在main.py中使用相对导入(比如from .utils import DBUtils),Spark分布式环境下可能出现路径解析问题,建议改用绝对路径导入,确保Worker节点能正确识别模块位置。
内容的提问来源于stack exchange,提问作者sakthy
相关产品推荐
相关产品推荐

