1、啥是Window?Window有啥作用?
Flink 認為 Batch 是 Streaming 的一個特例,所以 Flink 底層引擎是一個流式引擎,在上面實現了流處理和批處理。而窗口(window)就是從 Streaming 到 Batch 的一個橋梁。Flink 提供了非常完善的窗口機制,這是Flink 最大的亮點之一(其他的亮點包括消息亂序處理,和 checkpoint 機制)。
Window是一種切割無限數據集為有限塊並進行相應計算的處理手段(跟keyBy一樣,也是一種分組手段,只不過同一event可能被分到多個組)
在流處理應用中,數據是連續不斷的,因此我們不可能等到所有數據都到了才開始處理。當然我們可以每來一個消息就處理一次,但是有時我們需要做一些聚合類的處理,例如:在過去的1分鍾內有多少用戶點擊了我們的網頁。在這種情況下,我們必須定義一個窗口,用來收集最近一分鍾內的數據,並對這個窗口內的數據進行計算。
2、Flink Window大分類
2.1、Keyed Windows(在已經按照key分組的基礎上(KeyedStream),再構建多任務並行window)
2.2、Non-Keyed Windows(在未分組的DataStream上構建單任務window,並行度是1,API都帶All后綴)
2.3、Keyed Windows vs Non-Keyed Windows(以基於time的window為例)
3、Window的生命周期
3.1、創建:當屬於該窗口的第一個元素到達時就會創建該窗口
3.2、銷毀:當時間(event/process time)超過窗口的結束時間戳+用戶指定的延遲時(allowedLateness(<time>)),窗口將被移除(僅限time-based window)
例如:對於一個每5分鍾創建Tumbling Windows(即翻滾窗口)窗口,允許1分鍾的時延,Flink將會在12:00到12:05這段時間內第一個元素到達時創建窗口,當watermark超過12:06時,該窗口將被移除。
3.2、Trigger(觸發器)
指定了窗口函數在什么條件下可被觸發,觸發器還可以決定在創建和刪除窗口之間的任何時間清除窗口的內容。在這種情況下,清除僅限於窗口中的元素,而不是窗口元數據。這意味
着新數據仍然可以添加到該窗口中。
例如:當窗口中的元素個數超過4個時― 或者 ‖當水印達到窗口的邊界時―觸發計算
3.3、Window的函數
函數里定義了應用於窗口(Window)內容的計算邏輯
3.4、Evictor(驅逐者)
將在觸發器觸發之后或者在函數被應用前后,清除窗口中的元素
4、Window Assinger是干啥的
當你決定stream是否keyby之后,window是沒有構建的,你還需要指定一個window Assinger用於定義元素如何分配到窗口中。
window Assinger如何指定?
Keyedstream:window(WindowAssigner) non-keyed streams :windowAll(WindowAssigner)
window Assinger的作用:負責將每個傳入的元素分配給一個或多個窗口