Flink的滾動視窗、會話視窗、滑動視窗及其應用

codenow.fun發表於2020-10-13

當我們需要在時間視窗維度上對資料進行聚合時,視窗是流處理應用中經常需要解決的問題。Flink的視窗運算元為我們提供了方便易用的API,我們可以將資料流切分成一個個視窗,對視窗內的資料進行處理

視窗主要有兩種,一種基於時間(Time-based Window),一種基於數量(Count-based Window)。本文主要討論Time-based Window,在Flink原始碼中,用TimeWindow表示。每個TimeWindow都有一個開始時間和結束時間,表示一個左閉右開的時間段。Flink為我們提供了一些內建的WindowAssigner,即滾動視窗、滑動視窗和會話視窗

滾動視窗

滾動視窗模式下視窗之間不重疊,且視窗長度(Size)是固定的。我們可以用TumblingEventTimeWindowsTumblingProcessingTimeWindows建立一個基於Event Time或Processing Time的滾動時間視窗。視窗的長度可以用org.apache.flink.streaming.api.windowing.time.Time中的secondsminuteshoursdays來設定。

滑動視窗

滑動視窗以一個步長(Slide)不斷向前滑動,視窗的長度固定。使用時,我們要設定Slide和Size。Slide的大小決定了Flink以多快的速度來建立新的視窗,Slide較小,視窗的個數會很多。Slide小於視窗的Size時,相鄰視窗會重疊,一個元素會被分配到多個視窗;Slide大於Size,有些元素可能被丟掉。

會話視窗

會話視窗模式下,兩個視窗之間有一個間隙,被稱為Session Gap。當一個視窗在大於Session Gap的時間內沒有接收到新資料時,視窗將關閉。在這種模式下,視窗的長度是可變的,每個視窗的開始和結束時間並不是確定的。我們可以設定定長的Session Gap,也可以使用SessionWindowTimeGapExtractor動態地確定Session Gap的長度。

相關文章