我是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继承)是错误的还是需要添加其他内容。
任何意见将不胜感激,谢谢大家!
答案 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)
您是否可以尝试在https://github.com/apache/beam/blob/a2b0ad14f1525d1a645cb26f5b8ec45692d9d54e/sdks/python/apache_beam/examples/cookbook/coders.py#L88中设置选项save_main_session = True
。