一:WaterMark
本質:時間戳
作用:用於處理亂序事件
適用場景:基於事件時間做窗口運算
產生頻率:默認是來一條數據下發一次watermark,但是可以調整setAutoWatermarkInterval參數設置下發watermark的時間間隔,性能會有一定的提升。
多並發的情況下,取wateramark最小的一個,例如:p1-> 12,p2->14,p3->8,則watermark取最小的8
獲取watermark的位置:最好緊跟着source
說明:source端假設有兩個並發,並發1的wateramark是33,並發2的watermark是88,那么source的watermark就取最小的那個33,但是如果在map之后獲取watermark,由於是並發的,多個並發之間的數據沒有順序,可能來的數據的wateramark是50,但是很多數據產生的watermark都小於50,這樣就會導致數據大量丟失,所以watermark的獲取最好緊跟着source。
二:Window
2.1 類型匯總
窗口分為三種,timewindow、countwindow和自定義的window。timewindow還分為滾動窗口,滑動窗口和會話窗口,圖中沒有畫出,比較常用的是滾動窗口。
2.2 滾動窗口
窗口大小是人為設置的,一條事件同時只能在一個窗口中,窗口之間不重疊。
2.3 滑動窗口
窗口大小是人為設置的,滑動的大小也是人為設置的,一條事件可能同時存在於多個窗口中,窗口之間可重疊。
2.4 會話窗口
窗口沒有固定的開始和結束時間,窗口不重疊。
三:Window和watermark的結合處理數據亂序問題
這里面有兩個時間概念:生成watermark的時候,允許亂序的時間和allowedLatest。
通過運行結果可以看出:第一條數據進來的時候,生成一個窗口為[15,20),第二條數據進來的時候同樣屬於第一個窗口,當第三條數據進來的時候,產生的watermark大於第一個窗口的結束時間,所以第一個窗口觸發計算,產生結果,當第四條數據進來的時候,由於第一個窗口還沒有銷毀並且屬於第一個窗口,所以可以再次觸發窗口運算,第一個窗口的銷毀時間為2019-05-30 17:12:22,也就是當watermark的時間大於這個值的時候,再來屬於該窗口的數據就屬於延遲數據,不能觸發運算,之后進來的數據依舊是如此。