如何使ReadAllFromText不阻塞光束管道?

时间:2018-09-02 21:47:33

标签: google-cloud-storage google-cloud-dataflow apache-beam apache-beam-io

我想实现一个非常简单的光束管道:

read google storage links to text files from PubSub topic->read each text line by line->write to BigQuery.

Apache Beam为每个进程预先实现了PTransform。

所以管道应该是:

Pipeline | ReadFromPubSub("topic_name") | ReadAllFromText() | WriteToBigQuery("table_name")

但是,ReadAllFromText()以某种方式阻塞了管道。创建自定义PTransform可以正常工作(无阻塞),该自定义PTransform可在从PubSub读取并将其写入BigQuery表后返回随机行。添加固定的3秒窗口或触发每个元素也不能解决问题。

每个文件大约10MB和23K行。

很遗憾,我找不到有关ReadAllFromText应该如何工作的文档。如果它尝试阻塞管道直到读取所有文件,那将是很奇怪的。我希望该函数在读取每条线后就将其推入管道。

上述行为是否存在已知原因?是错误还是我做错了什么?

管道代码:

pipeline_options = PipelineOptions(pipeline_args)
    with beam.Pipeline(options=pipeline_options) as p:
        lines = p | ReadFromPubSub(subscription=source_dict["input"]) \
                | 'window' >> beam.WindowInto(window.FixedWindows(3, 0)) \
                | ReadAllFromText(skip_header_lines=1)

            elements = lines | beam.ParDo(SplitPayload())

            elements | WriteToBigQuery(source_dict["output"], write_disposition=BigQueryDisposition.WRITE_APPEND)
    .
    .
    .
    class SplitPayload(beam.DoFn):
        def process(self, element, *args, **kwargs):

            timestamp, id, payload = element.split(";")

            return [{
                'timestamp': timestamp,
                'id': id,
                'payload': payload
            }]

0 个答案:

没有答案