使用DataFlow从多个PubSub主题流到BigQuery时,邮件卡在GBP中吗?

时间:2018-08-23 11:08:48

标签: java google-bigquery google-cloud-dataflow google-cloud-pubsub apache-beam-io

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

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

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

我发现了以下三种变通办法(每个变通办法都是彼此分开的)

  • 在Pubsub订阅上添加一个“ withTimestampAttribute”调用。属性的名称根本没有关系-传入消息中的属性可以是任何现有的或不存在的
  • 将PubSub订阅的数量减少到仅1个
  • 删除两者之间的Flatten.pCollections操作,创建多个完全相同的管道

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

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

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

1 个答案:

答案 0 :(得分:2)

您是否将加窗应用于管道? Beam documentation会警告您使用无边界的PCollection(例如Pub / Sub),而不会出现任何窗口或触发事件:

  

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

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