Flink Window觸發機制

  • 2019 年 12 月 2 日
  • 筆記

Flink的Window類型

Flink基本分有3種window類型:CountWindow,TimeWindow和SessionWindow。 其中,CountWindow和TimeWindow還有滑動與滾動區分。

通常,window的api定義形式為:

stream        .keyBy(...)        .window(...)   // timeWindow,countWindow,SessionWindows.withGap(Time.minutes(10))        [.trigger(...)]        [.evictor(...)]        [.allowedLateness()]        .reduce/fold/apply()

窗口函數有哪些

定義完窗口分配器後,需要指定在每個窗口上執行的計算,這就是窗口函數的職責。 在了解有哪些窗口函數之前,有必要了解Window的聚合分類: 全量聚合:簡單點說是等屬於窗口的數據到齊之後,才開始進行聚合計算;即全量聚合在未觸發之前,會保存之前的狀態,在最後窗口觸發時,才會進行計算。(所以全量聚合的壓力會很大。) 常見的窗口函數: apply(WindowFunction) — 不過1.3之後被棄用 process(processWindowFunction)

增量聚合:窗口每進入一條數據,就進行一次計算。 reduce(reduceFunction); fold; aggregate(aggregateFunction); sum(key);min(key);max(key) sumBy(key);minBy(key);maxBy(key)

我們需要根據業務場景需要,決定使用是全量聚合還是增量聚合,並進一步選擇使用哪一種聚合函數。

Window何時會被觸發

Window何時被觸發計算,是由觸發器Trigger的onElement方法所決定。

該方法的參數: (1)element:到達的元素 (2)timestamp:元素達到的時間戳 (3)window:元素將被分配的窗口 (4)context:上下文

以時間類型設置為EventTime之後,觸發器就是EventTimeTrigger,對應的onElement方法:

方法很簡單:如果當前的watermark已經大於或等於窗口的最大時間戳(即窗口的endTime),那麼就會觸發窗口計算,並輸出結果。 TriggerResult.FIRE:窗口計算並輸出結果,儘管未清除窗口,但保留了所有元素。 否則的話,就是註冊一個以窗口的最大時間戳為時間的定時器。

window.maxTimestamp()

這裡的end是指窗口的結束時間,通常是在WindowAssigner中指定,WindowAssigner有:

以TumblingEventTimeWindows為例: