Google 具有边界集合的 Cloud Dataflow 是否以批处理模式移动水印?
Does Google Cloud Dataflow with bounded collection move watermark in batch mode?
我有一个从有界集合中的数据库读取数据的管道。集合中的每个元素都有一个分配了 ProcessContext.outputWithTimestamp
的时间戳。使用可拆分的 DoFn 读取数据,其中 ProcessContext.updateWatermark
在 ProcessElement
的末尾调用。 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' 上的组合器优化)。
我有一个从有界集合中的数据库读取数据的管道。集合中的每个元素都有一个分配了 ProcessContext.outputWithTimestamp
的时间戳。使用可拆分的 DoFn 读取数据,其中 ProcessContext.updateWatermark
在 ProcessElement
的末尾调用。 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' 上的组合器优化)。