我有一个Dataflow管道从PubSub主题读取事件数据。收到消息时,我会执行转换步骤,以使事件数据适合我想要的BigQuery架构。但是,如果我创建的输入不适合模式,我会遇到问题。显然,写入BigQuery是无限重试的:
Count: 76 RuntimeError: Could not successfully insert rows to BigQuery table
目前我正在进行大量的手动检查,输入确实符合架构,但是,在我没有考虑的情况下,我会积累RuntimeErrors。有没有办法尝试写入BigQuery,以防万一用原始输入执行其他操作失败?或者,有没有办法尝试多次写入,否则无需添加新的RuntimeErrors就会无声地失败?
编辑:我正在使用python SDK。以下是我进一步澄清的简化管道:
with beam.Pipeline(options=options) as pipeline:
# Read messages from PubSub
event = (pipeline
| 'Read from PubSub' >> beam.io.gcp.pubsub.ReadStringsFromPubSub(topic))
output = (event
| 'Create output' >> beam.transforms.core.FlatMap(lambda event: [{'input': event}]))
# Write to Big Query
_ = (output
| 'Write log to BigQuery' >> beam.io.gcp.bigquery.WriteToBigQuery(
table=table,
dataset=dataset,
project=project,
schema=schema,
create_disposition=beam.io.gcp.bigquery.BigQueryDisposition.CREATE_NEVER,
write_disposition=beam.io.gcp.bigquery.BigQueryDisposition.WRITE_APPEND))
如果我的表中没有列'input',则作业将死亡。看了https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/gcp/bigquery.py#L1279之后,这就是这种行为的原因。通过自定义https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/gcp/bigquery.py#L1187而不是提高RuntimeError,我可以克服我的问题,但是,这感觉非常麻烦。有人建议采用更简单的方法吗?
答案 0 :(得分:0)
如果您自己编写了管道,那么您应该可以在BigQueryIO上使用setFailedInsertRetryPolicy InsertRetryPolicy.neverRetry
答案 1 :(得分:0)
Beam - 用于流媒体的Python SDK非常有限。
https://beam.apache.org/documentation/sdks/python-streaming/
Python流式传输管道执行是从Beam SDK版本2.5.0开始实验可用的(有一些限制)。
Python流执行目前不支持以下功能。
常规光束功能: 这些不受支持的Beam功能适用于所有跑步者。
DataflowRunner特定功能: 此外,DataflowRunner目前不支持使用Python流执行的以下Cloud Dataflow特定功能。
此处提供更多信息:https://beam.apache.org/documentation/sdks/python-streaming/#unsupported-features
答案 2 :(得分:0)
(使用直接运行器时)可能会帮助您的事情是将['FailedRows']从插入位置移至
final_to_bq = (data
| 'Write to BQ' >> beam.io.WriteToBigQuery( ... )
)
然后:
print_failed_rows = (final_to_bq['FailedRows']
| 'print failed' >> beam.ParDo(Printer())
)
这对使用 DirectRunner 很有帮助……但还不能与 DatflowRunner 一起使用...