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

时间:2019-10-16 09:46:32

标签: python json google-cloud-platform google-cloud-dataflow

我是GCP数据流的新手。

我尝试从GCP云存储中读取文本文件(单行JSON字符串)为JSON格式,然后根据某些字段的值将其拆分并输出到GCP云存储(作为JSON字符串文本文件)。

这里是my code

但是,我在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。 apache-beam版本:2.15.0

[Update1]

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

pipeline_options.view_as(SetupOptions).save_main_session = True

提供的链接显示:

  此工作流程中的

DoFn依赖全局上下文(例如,一个模块   在模块级别导入)

link支持上述建议。

但是,发生了相同的错误。

因此,我在考虑我的_JsonSink的实现(从filebasedsink.FileBasedSink继承)是错误的还是需要添加其他内容。

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

4 个答案:

答案 0 :(得分:2)

使用here中的指南,我设法使您的示例得以运行。

目录结构:

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

setup.py:

import setuptools

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

main.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创建一个程序包并将其安装在Dataflow远程工作器上。 setuptools需要__init__.py文件才能将dataflow_json/目录标识为软件包。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我终于找到了问题所在

我使用Python3的某些功能实现了'_jsonsink'类

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

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

谢谢大家!

答案 3 :(得分:0)