【问题标题】:Error running Beam job with DataFlow runner (using Bazel): no module found error使用 DataFlow 运行器运行 Beam 作业时出错(使用 Bazel):未找到模块错误
【发布时间】:2021-06-06 23:23:11
【问题描述】:

我正在尝试使用 python sdk 在数据流上运行一个梁作业。

我的目录结构是:

beamjobs/
  setup.py
  main.py
  beamjobs/
    pipeline.py

当我直接使用python main.py 运行作业时,作业会正确启动。我使用setup.py 来打包我的代码,并通过运行时选项setup_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'

这让我很惊讶,因为上面的日志显示: Successfully installed beamjobs-0.0.1 pyyaml-5.4.1 这样我的包就安装成功了。

我不明白使用 python 运行或使用 bazel 运行之间的这种差异。

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

有什么想法吗?

【问题讨论】:

    标签: google-cloud-dataflow apache-beam bazel dataflow


    【解决方案1】:

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

    问题在于包实际上是空的,因为我在py_binary 规则中包含的唯一依赖项是setup.py 文件。 解决方法是将所有其他 python 文件也包含在二进制文件中。我通过创建 py_library 规则来将所有其他文件添加为依赖项来做到这一点。

    【讨论】:

      【解决方案2】:

      可能是 Bazel 生成的 wrapper-runner 脚本(您可以通过在目标上调用 bazel build 找到它的路径)限制脚本中可用的模块集。正确的做法是通过 Bazel 获取 PyPI 依赖项,查看example

      【讨论】:

      • 这就是我所做的,我使用 python_rules 提供 apache-beam 作为依赖项。我在数据流日志中看到 apache-beam 和我的包(来自 setup.py)都已正确安装
      猜你喜欢
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多