Python 在数据流管道中写入BigQuery时捕获失败
我有一个从PubSub主题读取事件数据的数据流管道。当接收到消息时,我会执行一个转换步骤,以使事件数据适合所需的BigQuery模式。但是,如果创建的输入不符合模式,则会遇到问题。显然,写入BigQuery是无限次的:Python 在数据流管道中写入BigQuery时捕获失败,python,google-bigquery,google-cloud-dataflow,google-cloud-pubsub,Python,Google Bigquery,Google Cloud Dataflow,Google Cloud Pubsub,我有一个从PubSub主题读取事件数据的数据流管道。当接收到消息时,我会执行一个转换步骤,以使事件数据适合所需的BigQuery模式。但是,如果创建的输入不符合模式,则会遇到问题。显然,写入BigQuery是无限次的: Count: 76 RuntimeError: Could not successfully insert rows to BigQuery table 目前我正在做大量的手动检查,输入确实符合模式,但是,在我没有考虑的情况下,我积累了运行时错误。是否有一种方法可以尝试写入
Count: 76 RuntimeError: Could not successfully insert rows to BigQuery table
目前我正在做大量的手动检查,输入确实符合模式,但是,在我没有考虑的情况下,我积累了运行时错误。是否有一种方法可以尝试写入BigQuery,以防无法使用原始输入执行其他操作?或者,是否有一种方法可以尝试多次写入,或者在不添加新的运行时错误的情况下以静默方式失败
编辑:我正在使用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”列,则作业将终止。经过仔细观察,似乎这就是这种行为的原因。通过定制而不是引发运行时错误,我可以克服我的问题,但是,这感觉相当麻烦。有人对更简单的方法有什么建议吗?如果您自己编写了管道,那么您应该能够在BigQueryIO上使用它来实现流媒体的Beam-Python SDK是非常有限的 从Beam SDK版本2.5.0开始,Python流式管道执行在实验上是可用的(有一些限制) Python流执行当前不支持以下功能 一般光束功能: 这些不受支持的梁特征适用于所有流道
- 状态和计时器API
- 自定义源API
- 可拆分DoFn API
- 处理迟交的数据
- 用户定义的自定义窗口fn
- 流式自动缩放
- 更新现有管道
- 云数据流模板
- 一些监视功能,例如毫秒计数器、显示数据、度量和转换的元素计数。但是,支持源的日志记录、水印和元素计数
在使用direct runner时,从插入中获取['FailedRows']可能会对您有所帮助
final_to_bq = (data
| 'Write to BQ' >> beam.io.WriteToBigQuery( ... )
)
然后:
这对使用DirectRunner很有帮助。。。但是还没有使用DatflowRunner…您是否运行了一个模板数据流管道来执行此操作?还有关于这个错误的更多信息吗?我用python创建了一个自定义数据流管道。对于符合模式的有效负载,作业运行良好。自定义验证过滤问题列表,并将其写入单独的调试表中,这样也可以正常工作。然而,在我没有考虑的情况下,这项工作就会死亡。我用一个简化的管道编辑了这个问题,以提供更多细节。与您的情况相关的公共功能请求已打开。你可以在这里看-哦,太好了,我真的很感激!嘿,谢谢你的回答。但是,我使用的是python,找不到类似的东西。我编辑了这个问题以提供更多的细节。唉,python还没有一个同等的特性。但我理解你希望你的管道继续运行的需要,即使一个元素失败。谢谢你,但是,我看不到与我的问题相关的东西。此外,还有一点让我感到困惑:它说“Python流媒体管道执行从Beam SDK版本2.5.0开始就在实验中可用[…]”(当前最新版本为2.4.0),这与Python数据流SDK的发行说明一致。然而,像我上面发布的管道一样,它在流模式下为我工作,但有一些(出于我的目的)限制。我遗漏了什么吗?用于流媒体的Dataflow python SDK是可用的,但是有些功能可能会改变,有些功能还不能工作。因此,一些简单的流媒体示例可能会工作,因为该功能可能已经开发出来了。我想关键是他们将拥有2.5.0发布的大部分功能。
print_failed_rows = (final_to_bq['FailedRows']
| 'print failed' >> beam.ParDo(Printer())
)