我有一条管道,该管道从有界集合中的数据库中读取数据。集合的每个元素都有一个用ProcessContext.outputWithTimestamp
分配的时间戳。使用可拆分的DoFn读取数据,其中ProcessContext.updateWatermark
的末尾调用ProcessElement
。总而言之,DoFn可以处理约100个拆分,因此不是一个拆分。
稍后在管道中,定义了以下固定窗口:
Window.<Map.Entry<Key, Long>>into(
FixedWindows.of(Duration.standardSeconds(10)))
.withAllowedLateness(Duration.ZERO)
.triggering(AfterWatermark.pastEndOfWindow()
.withEarlyFirings(AfterPane.elementCountAtLeast(10))))
.discardingFiredPanes()
在窗口之后,按每个键组合集合:Sum.longsPerKey()
问题在于,在完全读取集合之前,集合的元素永远不会通过组合器。 我的猜测是Dataflow根本不计算/移动水印,这与事实接近吗?
我的问题与Early results from GroupByKey transform非常相似,但是在我的情况下,集合是由Splittable DoFn读取的,其中在每个元素的末尾调用ProcessContext.updateWatermark
。
答案 0 :(得分:1)
是的,这是批处理模式管道的预期行为,而不管使用Splittable DoFn。
通常,所有元素一次(全部)通过每个步骤。窗口的结果可能会在其他窗口之前得到处理,但这与容量和分布式执行更多有关。
最后,GroupByKey或您的情况下的Sum By Key强制执行随机操作,该操作要求所有数据在实际执行SBK转换之前已准备就绪。
我会说你是对的,在这种情况下水印不会被跟踪。
答案 1 :(得分:1)
在批处理管道中,您可以想到水印一次从最小移动到最大。因此,所有窗口在逻辑上都会立即触发。就像ch_mike提到的那样,每个阶段都在其下游阶段运行之前完全执行。但是它们元素应该通过组合器(假设您是指“映射器”上的组合器优化)。