我正在使用全局无界流与状态处理和计时器相结合,以便按事件时间戳为每个键完全排序一个流。该问题的答案描述了该解决方案:
Processing Total Ordering of Events By Key using Apache Beam
为了在发生故障或由于其他原因而停止后重新启动管道,我需要确定保证所有其他事件已在下游处理的最低事件时间戳。此时间戳可以定期计算并持久保存到数据存储区并用作源IO(Kinesis)的输入,以便可以重新读取流而无需返回到开头。 (我们可以重播事件)
我认为有状态转换在定时器触发时发出最低处理时间戳作为输出,然后全局组合所有输出以找到最小值。但是,无法使用全局合并操作,因为必须首先应用窗口或触发器。
假设我的有状态转换在计时器触发时发出一个Long,表示最小的时间戳,我就像这样定义管道:
p.apply(events)
.apply("StatefulTransform", ParDo.of(new StatefulTransform()))
.apply(Window.<Long>configure().triggering(Repeatedly.forever(AfterFirst.of(
AfterPane.elementCountAtLeast(100),
AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardMinutes(1))))))
.apply(Combine.globally(new MinLongFn()))
.apply("WriteCheckpoint", ParDo.of(new WriteCheckpoint()));
这是否确保只有在所有并行工作者发出至少一个窗格时才会写入检查点?我担心联合收割机操作可能只对一些工人的窗格进行操作,例如:可能有一个工人失败或仍在等待另一个事件触发它的计时器。
答案 0 :(得分:0)
我是Beam的新手,但是根据此博客https://beam.apache.org/blog/2017/08/16/splittable-do-fn.html,Splittable DoFn可能就是您想要的东西!
您可以创建一个SDF来获取流并接受输入元素作为起点。