具有限制集合的Google Cloud Dataflow是否以批处理模式移动水印?

时间:2018-08-10 14:04:23

标签: google-cloud-dataflow apache-beam

我有一条管道,该管道从有界集合中的数据库中读取数据。集合的每个元素都有一个用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

2 个答案:

答案 0 :(得分:1)

是的,这是批处理模式管道的预期行为,而不管使用Splittable DoFn。

通常,所有元素一次(全部)通过每个步骤。窗口的结果可能会在其他窗口之前得到处理,但这与容量和分布式执行更多有关。

最后,GroupByKey或您的情况下的Sum By Key强制执行随机操作,该操作要求所有数据在实际执行SBK转换之前已准备就绪。

我会说你是对的,在这种情况下水印不会被跟踪。

答案 1 :(得分:1)

在批处理管道中,您可以想到水印一次从最小移动到最大。因此,所有窗口在逻辑上都会立即触发。就像ch_mike提到的那样,每个阶段都在其下游阶段运行之前完全执行。但是它们元素应该通过组合器(假设您是指“映射器”上的组合器优化)。