2017-06-16 94 views
1

Apache Beam最近通过StateSpec@StateId注释引入了状态单元,部分支持Apache Flink和Google Cloud Dataflow。Beam中的状态处理 - 是否跨窗口窗格共享状态?

我的问题是关于状态垃圾收集,在有状态的DoFn用于窗口流的情况下。典型地,当窗口到期时(即,水印经过窗口的末端),由跑步者移除状态(垃圾收集)。然而,考虑窗玻璃被触发早期的情况下,以及解雇窗格被丢弃:

input.apply(Window.<MyElement>into(CalendarWindows.days(1)) 
    .triggering(AfterWatermark.pastEndOfWindow() 
    .withEarlyFirings(
    AfterProcessingTime.pastFirstElementInPane() 
     .plusDelayOf(Duration.standardMinutes(10)) 
)) 
    .discardingFiredPanes() 
    .apply(ParDo.of(new MyStatefulDofn())); 

在这种情况下,会为他们清早发射键的状态一直保持,直到窗口到期后?即在相同窗口中的后续窗格是否可以访问由较早的窗格写入的状态?

回答

1

您的触发配置不影响ParDo的有状态处理如何进行。这些元素立即提供给您的DoFn,无需任何缓冲/触发,并且您的DoFn在输出发生时直接控制。

您控制输出的事实是有状态的ParDo处理和由触发器控制的Combine.perKey之间的重要区别。这就是为什么有状态的ParDo通常是一个很好的选择,因为触发器对于您的用例来说不够丰富。

我比较有状态ParDo处理与Combine +触发了一些更详细的在我的岗位上梁博客:现在https://beam.apache.org/blog/2017/02/13/stateful-processing.html

,如果有GroupByKeyCombine.perKey上游某处从状态ParDo,然后输入元素将与来自上游的一些触发器相关联。但这并不影响您的有状态ParDo的状态如何管理。由于状态在元素之间持续存在,并且“窗格”只是一个元素,所以状态将保持到窗口完全到期。

非常好的总结导致您的问题,顺便说一句!