我想实现一个非常简单的光束管道:
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
}]