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
相关产品推荐
相关产品推荐

