使用setup.py在Dataflow运行Apache Beam任务出现ModuleNotFoundError
这个报错是因为Dataflow工作节点运行时无法识别你自定义的extract模块,通常是打包配置或提交参数有误导致的,可按以下步骤逐一排查修复:
- 检查提交作业的启动参数是否正确
你需要在Dataflow提交命令中显式指定setup.py路径,参数为--setup_file=./setup.py,示例提交命令参考:
缺少该参数时Dataflow不会自动打包你的自定义模块分发到工作节点。python main.py \ --runner=DataflowRunner \ --project=你的项目ID \ --region=运行区域 \ --setup_file=./setup.py \ # 其余你的作业参数 - 修正setup.py配置增强兼容性
部分场景下find_packages()的自动扫描逻辑会出现异常,你可以显式声明包路径和根目录,调整后的setup.py参考:
调整后可先在本地验证包扫描是否正常:在root_dir目录下执行from setuptools import setup, find_packages setup( name="g_dataflow", version="0.1.0", install_requires=[ 'google-cloud-storage==1.42.0' ], packages=find_packages(), # 新增下面这行指定包根目录 package_dir={'': '.'} )python -c "from setuptools import find_packages; print(find_packages())",确认输出包含extract即可。 - 调整导入写法避免路径问题
main.py中导入extract模块的代码请使用绝对导入写法,不要使用相对导入,示例:# 正确写法 from extract.extract import 你需要的类/方法 # 不要用类似 from .extract import xxx 的相对导入写法 - 备选更稳定的打包方案
如果上述调整还是报错,可以改用预打包的方式提交:- 在root_dir下执行
python setup.py sdist,执行完成后会在dist目录生成g_dataflow-0.1.0.tar.gz安装包 - 提交作业时把
--setup_file参数替换为--extra_package=./dist/g_dataflow-0.1.0.tar.gz即可。
- 在root_dir下执行
- 最后确认提交作业的工作目录,必须在root_dir根目录下执行提交命令,不要在root_dir的上级或下级目录提交。
内容的提问来源于stack exchange,提问作者Idhem
相关产品推荐
相关产品推荐

