标题几乎总结了一切。无论我设置窗口宽度有多短,在DirectRunner上运行作业时都不会触发GroupByKey
。使用DataflowRunner时,一切都按预期工作。
答案 0 :(得分:1)
GroupByKey
会在输入PCollection
的水印到达该窗口的末尾时触发特定窗口。如果它没有被触发,那意味着输入PCollection
的水印没有前进,或者它可能正在前进,但是你的所有数据最终都被丢弃了。
原因取决于PCollection
的生成方式。我的猜测是你可能直接从PubSubIO.read()
阅读它。计算PubSub的水印很有挑战性(特别是如果你使用的是自定义时间戳属性);在Direct runner中有一些已知的计算问题; Dataflow runner在运行时替换不同的实现,可以更准确地计算水印(但仍然不完美)。
不幸的是,我们目前缺乏监控直接跑步者水印进度的工具。您可以通过向PubsubUnboundedSource.PubsubReader.getWatermark()
添加一些日志语句来尝试调试此问题。您还可以在读取和GBK之间添加ParDo
,并打印出您最终收到的事件时间戳(c.timestamp()
)。
您还可以尝试配置窗口策略以不丢弃延迟数据,请参阅Managing late data。