使用 DataFlow 从多个 PubSub 主题流式传输到 BigQuery 时,消息卡在 GBP 中?

Messages stuck in GBP when streaming from multiple PubSub topics to BigQuery using DataFlow?

我有一个 Java DataFlow 管道,包含以下部分:

当要连接的订阅列表中有多个 PubSub 主题时,所有元素都会卡在 BigQuery 编写器中 Reshuffle 操作中的 GroupByKey 操作中。在发送几十条测试消息后,我让它 运行 几个小时,但没有任何内容写入 BigQuery。

我发现了以下三种变通方法(它们各自独立工作)

消息没有刻意加时间戳 - 仅使用 PubsubMessage 时间戳将它们写入 BigQuery 是完全可以接受的table。

这也让我感到困惑,即使添加一个不存在的时间戳属性似乎也能解决问题。我调试了问题以打印出管道内的时间戳,并且它们在两种情况下都具有可比性;当指定一个不存在的时间戳属性时,它似乎无论如何都会退回到 pubsub 时间戳。

是什么导致了这个问题?我该如何解决?对我来说,最接受table 的解决方法是删除 Flatten.pCollections 操作,因为它不会严格地使代码复杂化,但我无法理解它失败的原因。

您是否将 windowing 应用于您的管道? Beam documentation 警告您在没有任何 windowing 或触发的情况下使用无界 PCollection(如 Pub/Sub):

If you don’t set a non-global windowing function or a non-default trigger for your unbounded PCollection and subsequently use a grouping transform such as GroupByKey or Combine, your pipeline will generate an error upon construction and your job will fail.

在您的情况下,管道不会在构建时失败,但消息会卡在 GroupByKey 中,因为它正在等待 window 结束。尝试在 BigQuery 编写器之前添加一个 window,看看是否可以解决问题。