You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块,就会抛出导入错误。
修复方式:

  1. 进入你的项目根目录(即apps、l2lpt模块所在的上层目录,一般是/opt/spark-apps/),将所有自定义依赖模块打包为zip包,参考命令:
    zip -r py_deps.zip apps/ l2lpt/
  2. 将--py-files参数替换为指向该zip包的路径,不需要再逐个罗列零散的.py文件,Spark会自动解压zip包并保留完整目录结构,模块导入就能正常生效。
  3. 额外注意:如果使用集群模式提交,要保证--py-files指定的路径在所有集群节点都可访问,可以把依赖包同步到所有节点的相同本地路径,也可以上传到HDFS等共享存储后使用对应路径引用。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:12:15