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

Does Google Cloud Dataflow with bounded collection move watermark in batch mode?

我有一个从有界集合中的数据库读取数据的管道。集合中的每个元素都有一个分配了 ProcessContext.outputWithTimestamp 的时间戳。使用可拆分的 DoFn 读取数据,其中 ProcessContext.updateWatermarkProcessElement 的末尾调用。 DoFn 总共处理大约 100 个分割,所以它不是一个分割。

稍后在管道中,定义了以下固定 window:

Window.<Map.Entry<Key, Long>>into(
    FixedWindows.of(Duration.standardSeconds(10)))
        .withAllowedLateness(Duration.ZERO)
        .triggering(AfterWatermark.pastEndOfWindow()
            .withEarlyFirings(AfterPane.elementCountAtLeast(10))))
        .discardingFiredPanes()

在 window 之后,集合按键组合:Sum.longsPerKey()

问题是集合的元素在集合被完全读取之前永远不会通过组合器。这是 Dataflow 在批处理模式下的预期行为吗? 我的猜测是 Dataflow 根本没有 compute/move 水印,它接近事实吗?

我的问题与 Early results from GroupByKey transform 非常相似,但在我的例子中,集合由 Splittable DoFn 读取,其中 ProcessContext.updateWatermark 在每个元素的末尾调用。

是的,这是批处理模式管道的预期行为,无论是否使用可拆分的 DoFn。

通常,所有元素一次(一起)通过每个步骤。 window 的结果可能先于其他结果得到处理,但这更多地与容量和分布式执行有关。

最后,GroupByKey,或者在你的情况下,按键求和,强制进行洗牌操作,这需要在实际执行 SBK 转换之前准备好所有数据。

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

在批处理管道中,您可以将水印从最小值一次移动到最大值。所以所有 windows 合乎逻辑地同时触发。正如 ch_mike 提到的,在批处理中,每个阶段在其下游阶段运行之前完全执行。但是它们的元素应该通过组合器(假设您指的是 'mapper' 上的组合器优化)。