我有一个包含以下部分的 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 操作,因为它不会严格地使代码复杂化,但我无法理解它失败的原因。