2017-06-16 97 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的狀態如何管理。由於狀態在元素之間持續存在,並且「窗格」只是一個元素,所以狀態將保持到窗口完全到期。

非常好的總結導致您的問題,順便說一句!