簡體   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