Flink中的Window
1 Window
Streaming流式計算是一種被設計用於處理無限資料集的資料處理引擎,而無限資料集是指一種不斷增長的本質上無限的資料集,而Window是一種切割無限資料理為有限塊進行處理的手段
Window是無限資料流處理的核心,Window將一個無限的Stream拆分成有限大小的”buckets”桶,我們可以在這些桶上做計算操作
Window可以分成兩類:
-
CountWindow
:按照指定的資料條數生成一個Window,與時間無關 -
TimeWindow
:按照時間生成Window-
滾動視窗(
Tumbling Windows
):將資料依據固定的視窗長度對資料進行切片特點:時間對齊,視窗長度固定,沒有重疊
適用場景:適合做 BI 統計等(做每個時間段的聚合計算)
-
滑動視窗(
Sliding Windows
):是固定視窗的更廣義的一種形式,滑動視窗由固定的視窗長度和滑動間隔組成特點:時間對齊,視窗長度固定,可以有重疊
適用場景:對最近一個時間段內的統計
-
會話視窗(
Session Windows
):由一系列事件組合一個指定時間長度的timeout間隙組成,類似於web應用session,也就是一段時間沒有接收到新資料就會生成新的視窗特點:時間無對齊
-
-
Global Window
:全域性視窗
2 Window API
2.1 TimeWindow
TimeWindow是將指定時間範圍內的所有資料組成一個window,一次對一個window裡面的所有資料進行計算
-
滾動視窗
Flink預設的時間視窗根據Processing Time進行視窗的劃分,將Flink獲取到的資料根據進入Flink的時間劃分到不同的視窗中
timeWindow(Time.seconds(5))
時間間隔可以通過
Time.milliseconds(x)
,Time.seconds(x)
,Time.minutes(x)
等其中的一個來指定 -
滑動視窗
滑動視窗和滾動視窗的函式名是完全一致的,只是在傳引數時需要傳入兩個引數,一個是window_size,一個是sliding_size
timeWindow(Time.seconds(10), Time.seconds(5))
時間間隔可以通過
Time.milliseconds(x)
Time.seconds(x)
,Time.minutes(x)
等其中的一個來指定
2.2 CountWindow
CountWindow根據視窗中相同key元素的數量來觸發執行,執行時只計算元素數量達到視窗大小的key對應的結果
注意:CountWindow的window_size指的是相同Key的元素的個數,不是輸入的所有元素的總數
-
滾動視窗
預設的CountWindow是一個滾動視窗,只需要指定視窗大小即可,當元素數量達到視窗大小時,就會觸發視窗的執行
countWindow(5)
-
滑動視窗
滑動視窗和滾動視窗的函式名是完全一致的,只是在傳引數時需要傳入兩個引數,一個是window_size,一個是sliding_size
countWindow(10, 2)
2.3 Window Function
Window Function定義了要對視窗中收集的資料做的計算操作,主要可以分為兩類
-
增量聚合函式(incremental aggregation functions)
每條資料到來就進行計算,保持一個簡單的狀態
典型的增量聚合函式有ReduceFunction,AggregateFunction
-
全視窗函式(full window functions)
先把視窗所有資料收集起來,等到計算的時候會遍歷所有資料
ProcessWindowFunction就是一個全視窗函式
2.4 其它可選 API
-
觸發器:
trigger()
定義window什麼時候關閉,觸發計算並輸出結果
-
移除器:
evitor()
定義移除某些資料的邏輯
-
allowedLateness()
允許處理遲到的資料
-
sideOutputLateData()
將遲到的資料放入側輸出流
-
getSideOutput()
獲取側輸出流