簡體   English   中英

使用 Dataflowrunner 時無法使用本機 Python3 庫 (ElementTree)

[英]Unable to use native Python3 Library (ElementTree) when using Dataflowrunner

我目前正在使用 Dataflow 處理/按摩來自 PubSub 的 XML 文本字符串。 我能夠使用DirectRunner作為我的 --runner 標志成功運行數據流作業。 但是,我在嘗試使用與DataflowRunner作為我的標志的完全相同的 Dataflow 作業創建 Dataflow 資源時遇到了問題。

從錯誤日志(使用 DataflowRunner 時)來看,我創建的 Dataflow 模板似乎無法識別:

import xml.etree.ElementTree as ET

每當我在管道中引用 ET 時,我都會收到“NameError: name 'ET' is not defined [while running 'generatedPtransform-419']”。 奇怪的是,我的 Dataflow 作業在 DirectRunner 上運行得非常好,這讓我相信使用 DataflowRunner 構建我的模板存在問題,因為 xml.etree.ElementTree 是一個簡單/原生的 PyPI 庫。

對於我的環境,我正在使用:
Python 3.7.7
阿帕奇光束 2.22.0

非常感謝任何幫助/指導,謝謝!

工作directrunner工作:

import apache_beam as beam
import argparse, xmltodict, json
from apache_beam.options.pipeline_options import PipelineOptions, SetupOptions
import xml.etree.ElementTree as ET

class FormatMessage(beam.DoFn):
    def process(self, line):
        xml_msg = ET.fromstring(line)

        # Code to construct XML Object (removed) 

        tree_new_xml = ET.ElementTree(element_msg)
        xml_dict = xmltodict.parse(ET.tostring(tree_new_xml.getroot(), encoding='utf8'))
        json_obj = str.encode(json.dumps(xml_dict), 'utf8')

        yield json_obj

def run(argv=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('--input_topic', help='Input topic read data from.', default='')
    parser.add_argument('--output_topic', help='Output topic to write data to.', default='')
    known_args, pipeline_args = parser.parse_known_args(argv)

    pipeline_options = PipelineOptions()
    pipeline_options.view_as(SetupOptions).save_main_session = True

    # Create and implement PubSub-to-PubSub pipeline
    p = beam.Pipeline(options=pipeline_options)
    (p
     | "Read PubSub Message" >> beam.io.ReadFromPubSub(topic=known_args.input_topic)
     | "Format Msg" >> beam.ParDo(FormatMessage())
     | "Write PubSub Output" >> beam.io.WriteToPubSub(known_args.output_topic)
     )
    p.run().wait_until_finish()

根據此文檔,您的問題是由於 Dataflow 工作人員上不可用的名稱。

請注意,如果您的全局命名空間中有無法腌制的對象,您將收到腌制錯誤。 如果錯誤與 Python 發行版中應該可用的模塊有關,您可以通過在本地導入模塊來解決此問題。

在您的情況下,您必須在您的進程function 中導入提到的庫,如下所示:

class FormatMessage(beam.DoFn):
    def process(self, line):
        import xml.etree.ElementTree as ET
        xml_msg = ET.fromstring(line)

        # Code to construct XML Object (removed) 

        tree_new_xml = ET.ElementTree(element_msg)
        xml_dict = xmltodict.parse(ET.tostring(tree_new_xml.getroot(), encoding='utf8'))
        json_obj = str.encode(json.dumps(xml_dict), 'utf8')

        yield json_obj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM