使用DirectRunner时,Apache Beam GroupByKey永远不会触发

时间:2017-11-07 05:41:59

标签: apache-beam

标题几乎总结了一切。无论我设置窗口宽度有多短,在DirectRunner上运行作业时都不会触发GroupByKey。使用DataflowRunner时,一切都按预期工作。

1 个答案:

答案 0 :(得分:1)

默认情况下,

GroupByKey会在输入PCollection的水印到达该窗口的末尾时触发特定窗口。如果它没有被触发,那意味着输入PCollection的水印没有前进,或者它可能正在前进,但是你的所有数据最终都被丢弃了。

原因取决于PCollection的生成方式。我的猜测是你可能直接从PubSubIO.read()阅读它。计算PubSub的水印很有挑战性(特别是如果你使用的是自定义时间戳属性);在Direct runner中有一些已知的计算问题; Dataflow runner在运行时替换不同的实现,可以更准确地计算水印(但仍然不完美)。

不幸的是,我们目前缺乏监控直接跑步者水印进度的工具。您可以通过向PubsubUnboundedSource.PubsubReader.getWatermark()添加一些日志语句来尝试调试此问题。您还可以在读取和GBK之间添加ParDo,并打印出您最终收到的事件时间戳(c.timestamp())。

您还可以尝试配置窗口策略以不丢弃延迟数据,请参阅Managing late data