错误 运行 使用 DataFlow runner 的 Beam 作业(使用 Bazel):没有找到模块错误
Error running Beam job with DataFlow runner (using Bazel): no module found error
我正在尝试 运行 使用 python sdk 在数据流上进行光束作业。
我的目录结构是:
beamjobs/
setup.py
main.py
beamjobs/
pipeline.py
当我 运行 作业直接使用 python main.py
时,作业会正确启动。我使用 setup.py
来打包我的代码,并使用 运行 时间选项 setup_file
.
来发送它
但是,如果我 运行 使用 bazel(使用 py_binary
规则包含 setup.py
作为数据依赖项),我最终会收到错误消息:
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
有什么想法吗?
可能是 Bazel 生成的 wrapper-runner 脚本(您可以通过在目标上调用 bazel build
找到它的路径)限制脚本中可用的模块集。正确的方法是通过 Bazel 获取 PyPI 依赖项,查看 example
好的,所以问题是我将文件 setup.py
作为 bazel 的依赖项发送;我可以在日志中看到我的包 beamjobs
已正确安装。
问题是包实际上是空的,因为我在 py_binary
规则中包含的唯一依赖项是 setup.py
文件。
解决方法是将所有其他 python 文件作为二进制文件的一部分。我通过创建 py_library
规则将所有其他文件添加为依赖项来做到这一点。
我正在尝试 运行 使用 python sdk 在数据流上进行光束作业。
我的目录结构是:
beamjobs/
setup.py
main.py
beamjobs/
pipeline.py
当我 运行 作业直接使用 python main.py
时,作业会正确启动。我使用 setup.py
来打包我的代码,并使用 运行 时间选项 setup_file
.
但是,如果我 运行 使用 bazel(使用 py_binary
规则包含 setup.py
作为数据依赖项),我最终会收到错误消息:
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
有什么想法吗?
可能是 Bazel 生成的 wrapper-runner 脚本(您可以通过在目标上调用 bazel build
找到它的路径)限制脚本中可用的模块集。正确的方法是通过 Bazel 获取 PyPI 依赖项,查看 example
好的,所以问题是我将文件 setup.py
作为 bazel 的依赖项发送;我可以在日志中看到我的包 beamjobs
已正确安装。
问题是包实际上是空的,因为我在 py_binary
规则中包含的唯一依赖项是 setup.py
文件。
解决方法是将所有其他 python 文件作为二进制文件的一部分。我通过创建 py_library
规则将所有其他文件添加为依赖项来做到这一点。