如何在BigQuery插入错误上崩溃/停止DataFlow Pub / Sub摄取

时间:2017-06-09 16:17:27

标签: google-bigquery google-cloud-dataflow google-cloud-pubsub

我正在寻找一种方法,让Google DataFlow作业在(特定)异常发生时停止从Pub / Sub中摄取。

来自Pub / Sub的事件是使用PubsubIO.Read.Bound<TableRow>通过TableRowJsonCoder读取的JSON,并直接流式传输到BigQuery BigQueryIO.Write.Bound。 (中间有一个ParDo可以在一天之内更改一个字段的内容和一些自定义分区,但这与此目的无关。)

当从PubSub中提取的事件/行中的字段不是目标BigQuery表中的列时,DataFlow作业在运行时记录IOExceptions,声称它无法插入行,但似乎确认这些消息并继续运行

我想要做的是停止从Pub / Sub接收消息和/或使Dataflow作业崩溃,以便警报可以基于最早的未确认消息的年龄。至少我想确保那些未能插入BigQuery的Pub / Sub消息不被激活,以便我可以解决问题,重新启动Dataflow作业并再次使用这些消息。

我知道这里有一个建议的处理错误输入的解决方案:https://cloud.google.com/blog/big-data/2016/01/handling-invalid-inputs-in-dataflow

我也知道Apache Beam上的这个PR,它允许插入没有违规字段的行: https://github.com/apache/beam/pull/1778

然而在我的情况下,我并不是真的想要防止错误输入,而是防止程序员错误,即将新字段添加到推送到Pub / Sub的JSON消息,但相应的DataFlow作业是没有更新。所以我真的没有错误的数据,我只是想在程序员犯错误时不要在更改任何有关消息格式之前部署新的Dataflow作业时崩溃。

我认为可以(类似于博客文章解决方案)创建一个自定义ParDo,用于验证每一行并抛出未捕获的异常并导致崩溃。

但理想情况下,我只想让一些配置无法处理插入错误并记录它,而只是崩溃工作或至少停止摄取。

1 个答案:

答案 0 :(得分:1)

你可以在BQ写入之前有一个带有DoFn的ParDo。 DoFn负责每隔X分钟获取输出表模式,并验证每个要写入的记录是否与预期的输出模式匹配(如果不是,则抛出异常)。

Old Pipeline:
PubSub -> Some Transforms -> BQ Sink

New Pipeline:
PubSub -> Some Transforms -> ParDo(BQ Sink Validator) -> BQ Sink

这样做的好处是,一旦有人修复了输出表模式,管道就会恢复。您希望抛出一个错误的错误消息,说明传入的PubSub消息有什么问题。

或者,您可以让BQ Sink Validator输出消息到PubSub DLQ(监视其大小)。在操作上,您必须更新表,然后重新输入DLQ作为输入。这样做的好处是只有坏消息会阻止管道执行。