spark-submit加--py-files运行报ModuleNotFoundError问题咨询
Spark --py-files 参数使用问题解答
问题复现
使用配置了--py-files参数的spark-submit提交任务时,已正确编写导入语句,运行仍抛出错误:ModuleNotFoundError: No module named 'apps'
使用的提交脚本如下:
spark_submit = ''' /opt/spark/bin/spark-submit \ --master spark://spark-master:7077 \ --jars /opt/spark-jars/postgresql-42.2.22.jar \ --driver-cores {} \ --driver-memory {} \ --executor-cores {} \ --executor-memory {} \ --num-executors {} \ --py-files /opt/spark-apps/l2lpt/models/FBP.py,/opt/spark-apps/l2lpt/utils/exceptions.py,/opt/spark-apps/l2lpt/anomaly_detector/anomaly_detector.py,/opt/spark-apps/l2lpt/l2lpt.py \ /opt/spark-apps/l2lpt/main.py {} {} '''.format( driver_cores, driver_memory, executor_cores, executor_memory, num_executors, offset, timestamp)
疑问解答
- 关于
--py-files后文件顺序是否影响运行:
单.py文件的罗列顺序不影响任务运行。Spark会将--py-files指定的所有资源统一分发到Driver和各Executor的临时工作目录,并将这些路径加入Python解释器的模块搜索路径,不存在按列表顺序加载依赖的逻辑,顺序不会引发模块找不到的问题。 - 关于是否需要把main函数调用的所有
.py文件都加入--py-files:
不需要罗列所有调用的文件,但所有被入口脚本直接或间接导入、不在集群Python环境默认搜索路径、也不在入口脚本同级目录的自定义模块,都必须通过--py-files分发到集群。
报错根因与修复方案
你当前遇到的No module named 'apps'错误,核心原因是你采用了罗列零散单文件的传参方式:Spark分发单个.py文件时,只会把文件本身放到工作目录,不会保留原有的项目目录层级。如果你的代码里存在from apps.xxx import xxx这类带层级的导入语句,解释器无法在平铺的工作目录里找到对应层级的apps模块,就会抛出导入错误。
修复方式:
- 进入你的项目根目录(即
apps、l2lpt模块所在的上层目录,一般是/opt/spark-apps/),将所有自定义依赖模块打包为zip包,参考命令:zip -r py_deps.zip apps/ l2lpt/ - 将
--py-files参数替换为指向该zip包的路径,不需要再逐个罗列零散的.py文件,Spark会自动解压zip包并保留完整目录结构,模块导入就能正常生效。 - 额外注意:如果使用集群模式提交,要保证
--py-files指定的路径在所有集群节点都可访问,可以把依赖包同步到所有节点的相同本地路径,也可以上传到HDFS等共享存储后使用对应路径引用。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

