Google cloud dataflow 有边界集合的Google云数据流是否在批处理模式下移动水印?
我有一个管道,它从一个有界集合中的数据库中读取数据。集合的每个元素都有一个时间戳,分配给Google cloud dataflow 有边界集合的Google云数据流是否在批处理模式下移动水印?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有一个管道,它从一个有界集合中的数据库中读取数据。集合的每个元素都有一个时间戳,分配给ProcessContext.outputWithTimestamp。使用可拆分的DoFn读取数据,其中在ProcessContext的末尾调用了ProcessElement。总的来说,DoFn使用大约100个拆分,因此它不是一个单独的拆分 稍后在管道中,定义了以下固定窗口: Window.<Map.Entry<Key, Long>>into( FixedWindows.of(
ProcessContext.outputWithTimestamp
。使用可拆分的DoFn读取数据,其中在ProcessContext的末尾调用了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()
Window.into(
固定窗口(持续时间标准秒(10)))
.允许延迟(持续时间为零)
.triggering(AfterWatermark.pastEndOfWindow()后)
.具有早期点火(后窗格。元素计数至少(10)))
.丢弃Firedpanes()
在窗口之后,集合按键组合:Sum.longsPerKey()
问题在于,在完全读取集合之前,集合的元素永远不会通过组合器。这是数据流在批处理模式下的预期行为吗?我的猜测是,数据流根本不会计算/移动水印,这是否接近事实
我的问题与非常类似,但在我的例子中,集合是由可拆分DoFn读取的,其中ProcessContext.updateWatermark
在每个元素的末尾被调用。是的,这是批处理模式管道的预期行为,无论使用的是可拆分DoFn
通常,所有元素一次(总共)通过每个步骤。一个窗口的结果可能比其他窗口的结果先得到处理,但这更多地与容量和分布式执行有关
最后,GroupByKey,或者在您的示例中是Sum By Key,强制执行一个洗牌操作,这要求在实际执行SBK转换之前准备好所有数据
我想说您是对的,在这种情况下不会跟踪水印。是的,这是批处理模式管道的预期行为,无论使用可拆分的DoFn
通常,所有元素一次(总共)通过每个步骤。一个窗口的结果可能比其他窗口的结果先得到处理,但这更多地与容量和分布式执行有关
最后,GroupByKey,或者在您的示例中是Sum By Key,强制执行一个洗牌操作,这要求在实际执行SBK转换之前准备好所有数据
我想说你是对的,在这种情况下,水印没有被跟踪。在批处理管道中,你可以想到水印一次从最小值移动到最大值。所以所有的窗户逻辑上都会同时着火。正如Chu mike提到的,在批处理中,每个阶段在其下游阶段运行之前完全执行。但是这些元素应该通过组合器(假设您在“映射器”上提到组合器优化)。在批处理管道中,您可以想到水印一次从最小值移动到最大值。所以所有的窗户逻辑上都会同时着火。正如Chu mike提到的,在批处理中,每个阶段在其下游阶段运行之前完全执行。但是这些元素应该通过组合器(假设您在“映射器”上提到组合器优化)。谢谢!我还发现了这一澄清。它说“在批处理模式下,当前水印进度从时间开始跳到输入完全消耗后的时间结束”。谢谢!我还发现了这一澄清。它表示“在批处理模式下,当前水印进度从时间开始跳到输入完全消耗后的时间结束”。