Google cloud dataflow 使用DataFlow runner(使用Bazel)运行Beam作业时出错:未找到模块错误

Google cloud dataflow 使用DataFlow runner(使用Bazel)运行Beam作业时出错:未找到模块错误,google-cloud-dataflow,apache-beam,bazel,dataflow,Google Cloud Dataflow,Apache Beam,Bazel,Dataflow,我正在尝试使用python sdk在数据流上运行beam作业 我的目录结构是: beamjobs/ setup.py main.py beamjobs/ pipeline.py 当我直接使用python main.py运行作业时,作业会正确启动。我使用setup.py打包我的代码,并使用运行时选项setup\u file将其提供给beam 但是,如果我使用bazel运行相同的作业(使用包含setup.py作为数据依赖项的py_binary规则),我最终会得到一个错误: Tr

我正在尝试使用python sdk在数据流上运行beam作业

我的目录结构是:

beamjobs/
  setup.py
  main.py
  beamjobs/
    pipeline.py
当我直接使用
python main.py
运行作业时,作业会正确启动。我使用
setup.py
打包我的代码,并使用运行时选项
setup\u file
将其提供给beam

但是,如果我使用bazel运行相同的作业(使用包含
setup.py
作为数据依赖项的
py_binary
规则),我最终会得到一个错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/dataflow_worker/batchworker.py", line 804, in run
    work, execution_context, env=self.environment)
  File "/usr/local/lib/python3.7/site-packages/dataflow_worker/workitem.py", line 131, in get_work_items
    work_item_proto.sourceOperationTask.split)
  File "/usr/local/lib/python3.7/site-packages/dataflow_worker/workercustomsources.py", line 144, in __init__
    source_spec[names.SERIALIZED_SOURCE_KEY]['value'])
  File "/usr/local/lib/python3.7/site-packages/apache_beam/internal/pickler.py", line 290, in loads
    return dill.loads(s)
  File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 275, in loads
    return load(file, ignore, **kwds)
  File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 270, in load
    return Unpickler(file, ignore=ignore, **kwds).load()
  File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 472, in load
    obj = StockUnpickler.load(self)
  File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 462, in find_class
    return StockUnpickler.find_class(self, module, name)
ModuleNotFoundError: No module named 'beamjobs'
这让我很惊讶,因为上面的日志显示:
已成功安装beamjobs-0.0.1 pyyaml-5.4.1
因此,我的软件包安装成功

我不理解用python运行和用bazel运行之间的这种差异

在这两种情况下,日志似乎都显示数据流试图使用image
gcr.io/cloud-dataflow/v1beta3/python37:2.29.0


有什么想法吗?

可能是Bazel生成的包装器运行程序脚本(您可以通过在目标上调用
Bazel build
找到它的路径)限制了脚本中可用的模块集。正确的方法是通过Bazel获取PyPI依赖项,看看

Ok,所以问题是我将文件
setup.py
作为Bazel中的依赖项发送;我可以在日志中看到我的包
beamjobs
安装正确

问题是包实际上是空的,因为我在
py_binary
规则中包含的唯一依赖项是
setup.py
文件。
修复方法是将所有其他python文件作为二进制文件的一部分包含在内。我通过创建
py_库
规则来添加所有其他文件作为依赖项。

我就是这么做的,我使用python_规则提供了
apachebeam
作为依赖项。我在数据流日志中看到ApacheBeam和我的包(来自setup.py)都已正确安装