1

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

  • PubSub 订阅者阅读多个主题
  • Flatten.pCollections 操作
  • 从 PubsubMessage 转换为 TableRow
  • BigQuery 编写器将所有内容写入动态表

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

我发现了以下三种解决方法(每种方法都与其他方法分开工作)

  • 在 Pubsub 订阅上添加“withTimestampAttribute”调用。属性的名称根本无关紧要 - 它可以是传入消息中任何现有或不存在的属性
  • 将 PubSub 订阅数量减少到只有 1 个
  • 删除其间的 Flatten.pCollections 操作,创建多个单独的管道做完全相同的事情

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

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

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

4

1 回答 1

2

您是否对管道应用了窗口化?Beam 文档警告您在没有任何窗口或触发的情况下使用无界 PCollection(如 Pub/Sub):

如果您没有为无界 PCollection 设置非全局窗口函数或非默认触发器,并随后使用 GroupByKey 或 Combine 等分组转换,则您的管道将在构造时生成错误并且您的作业将失败。

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

于 2018-08-23T11:51:11.283 回答