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

Spark 2.2.0 on YARN提交Python项目时模块找不到问题问询

解决Spark on YARN提交Python作业时模块找不到的问题

这种模块找不到的坑在Spark on YARN跑Python作业时太常见了,我帮你梳理几个最可能的遗漏点和对应的解决办法:

1. 先检查你的zip包结构是否正确

别着急提交,先在本地用unzip -l prediction.zip看看包内的文件结构:

  • 确保你的目标模块在zip的顶层目录,比如如果你的模块是my_utils,解压后应该直接看到my_utils/文件夹,而不是嵌套在prediction/之类的子目录里。不然Spark加载zip后,Python找不到对应的模块路径。
  • 如果你的模块是一个包(带子目录),一定要包含每个目录下的__init__.py文件(哪怕是空的),没有它Python不会把这个目录识别为合法的包。

打包的时候推荐在项目根目录执行递归打包命令,确保所有文件都被包含:

zip -r prediction.zip .

2. 别漏了--py-files参数配置

这是最容易忘的点!Spark不会自动识别你的zip包,必须在spark-submit命令里用--py-files指定依赖包,这样YARN集群的每个Executor才能获取到你的模块文件。正确的命令应该是这样的:

spark-submit --master yarn --deploy-mode cluster --py-files prediction.zip backtest.py
  • 如果你用的是client模式,本地环境可能能找到模块,但cluster模式下必须加这个参数,因为Driver会在YARN容器里启动,本地路径是无效的。

3. 调整模块导入方式,避免相对路径问题

在backtest.py里,尽量用绝对导入替代相对导入:

  • 错误示例:from .my_utils import helper(这种相对导入在集群环境下容易出路径问题)
  • 正确示例:from my_utils import helper(匹配zip包顶层的模块结构)

另外,别用sys.path.append("/path/to/module")这种硬编码的路径,集群容器里的路径和本地完全不一样,这种方式基本无效。

4. 确认Python版本兼容性

Spark 2.2.0对Python版本有要求,确保本地打包时用的Python版本和YARN集群上的Python版本一致(比如都是Python 2.7或者都是Python 3.6)。版本不兼容不仅可能导致模块找不到,还会引发各种奇怪的语法错误。

5. 查看YARN日志定位深层问题

如果上面的方法都没用,去YARN的ResourceManager页面找到你的Application,查看Executor或者Driver的日志。日志里会有完整的报错堆栈,比如是某个模块文件缺失,还是导入时依赖了其他未打包的库,这些细节能帮你快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:11:41