使用 DataFlow 从多个 PubSub 主题流式传输到 BigQuery 时,消息卡在 GBP 中?
Messages stuck in GBP when streaming from multiple PubSub topics to BigQuery using DataFlow?
我有一个 Java DataFlow 管道,包含以下部分:
- PubSub 订阅者阅读多个主题
- Flatten.pCollections操作
- 从 PubsubMessage 转换为 TableRow
- BigQuery 编写器将所有内容写入动态 table
当要连接的订阅列表中有多个 PubSub 主题时,所有元素都会卡在 BigQuery 编写器中 Reshuffle 操作中的 GroupByKey 操作中。在发送几十条测试消息后,我让它 运行 几个小时,但没有任何内容写入 BigQuery。
我发现了以下三种变通方法(它们各自独立工作)
- 在 Pubsub 订阅上添加 'withTimestampAttribute' 调用。属性的名称根本无关紧要 - 它可以是传入消息中任何现有或不存在的属性
- 将 PubSub 订阅数量减少到 1 个
- 删除中间的 Flatten.pCollections 操作,创建多个独立的管道做完全相同的事情
消息没有刻意加时间戳 - 仅使用 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,看看是否可以解决问题。
我有一个 Java DataFlow 管道,包含以下部分:
- PubSub 订阅者阅读多个主题
- Flatten.pCollections操作
- 从 PubsubMessage 转换为 TableRow
- BigQuery 编写器将所有内容写入动态 table
当要连接的订阅列表中有多个 PubSub 主题时,所有元素都会卡在 BigQuery 编写器中 Reshuffle 操作中的 GroupByKey 操作中。在发送几十条测试消息后,我让它 运行 几个小时,但没有任何内容写入 BigQuery。
我发现了以下三种变通方法(它们各自独立工作)
- 在 Pubsub 订阅上添加 'withTimestampAttribute' 调用。属性的名称根本无关紧要 - 它可以是传入消息中任何现有或不存在的属性
- 将 PubSub 订阅数量减少到 1 个
- 删除中间的 Flatten.pCollections 操作,创建多个独立的管道做完全相同的事情
消息没有刻意加时间戳 - 仅使用 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,看看是否可以解决问题。