繁体   English   中英

带有 python 的 GCP 数据流。 “AttributeError:无法在模块 'dataflow_worker.start' 上获取属性 '_JsonSink'

[英]GCP dataflow with python. "AttributeError: Can't get attribute '_JsonSink' on module 'dataflow_worker.start'

我是 GCP 数据流的新手。

I try to read text files(one-line JSON string) into JSON format from GCP cloud storage, then split it based on values of certain field and output to GCP cloud storage (as JSON string text file).

这是我的代码

但是,我在 GCP 数据流上遇到了一些错误:

Traceback (most recent call last):
  File "main.py", line 169, in <module>
    run()
  File "main.py", line 163, in run
    shard_name_template='')
  File "C:\ProgramData\Miniconda3\lib\site-packages\apache_beam\pipeline.py", line 426, in __exit__
    self.run().wait_until_finish()
  File "C:\ProgramData\Miniconda3\lib\site-packages\apache_beam\runners\dataflow\dataflow_runner.py", line 1346, in wait_until_finish
    (self.state, getattr(self._runner, 'last_error_msg', None)), self)
apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow pipeline failed. State: FAILED, Error:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/dataflow_worker/batchworker.py", line 773, in run
    self._load_main_session(self.local_staging_directory)
  File "/usr/local/lib/python3.7/site-packages/dataflow_worker/batchworker.py", line 489, in _load_main_session
    pickler.load_session(session_file)
  File "/usr/local/lib/python3.7/site-packages/apache_beam/internal/pickler.py", line 287, in load_session
    return dill.load_session(file_path)
  File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 410, in load_session
    module = unpickler.load()
  File "/usr/local/lib/python3.7/site-packages/dill/_dill.py", line 474, in find_class
    return StockUnpickler.find_class(self, module, name)
AttributeError: Can't get attribute '_JsonSink' on <module 'dataflow_worker.start' from '/usr/local/lib/python3.7/site-packages/dataflow_worker/start.py'>

我可以在本地运行这个脚本,但是当我尝试使用dataflowRunner时它失败了

请给我一些建议。

PS。 阿帕奇光束版本:2.15.0

[更新1]

我试试@Yueyang Qiu的建议,添加

pipeline_options.view_as(SetupOptions).save_main_session = True

提供的链接说:

此工作流程中的 DoFn 依赖于全局上下文(例如,在模块级别导入的模块)

这个链接支持上面的建议。

然而,同样的错误发生了。

所以,我在想我的 _JsonSink 实现(继承自 filebasedsink.FileBasedSink)是错误的还是需要添加其他东西。

任何意见将不胜感激,谢谢大家!

您遇到了一个已知问题,目前(截至 2.17.0 版本),Beam 不支持 Python 3 主模块中的super()调用。请查看BEAM-6158中的可能解决方案。 在解决 BEAM-6158 之前,Udi 的回答是解决此问题的好方法,这样您就不必在 Python 2 上运行管道。

使用此处的指南,我设法让您的示例运行。

目录结构:

./setup.py
./dataflow_json
./dataflow_json/dataflow_json.py  (no change from your example)
./dataflow_json/__init__.py  (empty file)
./main.py

设置.py:

import setuptools

setuptools.setup(
  name='dataflow_json',
  version='1.0',
  install_requires=[],
  packages=setuptools.find_packages(),
)

主要.py:

from __future__ import absolute_import

from dataflow_json import dataflow_json

if __name__ == '__main__':
    dataflow_json.run()

然后使用python main.py运行管道。

基本上发生的事情是'--setup_file=./setup.py'标志告诉 Beam 创建一个 package 并将其安装在 Dataflow 远程工作人员上。 setuptools 需要__init__.py文件将dataflow_json/目录识别为 package。

我终于发现了问题:

我使用 Python3 的一些功能实现的 class '_jsonsink'

但是,我不知道我将哪个版本的 Python 用于“Dataflowrunner”(实际上,我还没有弄清楚如何为 GCP 上的数据流运行器指定 python 版本。有什么建议吗?)

因此,我将代码重新编写为 Python2 兼容版本,一切正常!

谢谢大家!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM