大資料-flink-watermarks遲到資料怎麼處理?

我們知道流式資料集是沒有邊界的,資料會源源不斷的傳送到我們的系統中。

流式計算最終的目的是去統計資料產生彙總結果的,而在無界資料集上,如果做一個全域性的視窗統計,是不現實的。

只有去劃定一定大小的視窗範圍去做計算,才能最終彙總到下游的系統中,用來分析和展示。

大資料-flink-watermarks遲到資料怎麼處理?

在 Flink 進行視窗計算的時候,需要去知道兩個核心的資訊:

每個 Element 的 EventTime 時間戳?(在資料記錄中指定即可)

接入的資料,何時可以觸發統計計算 ? (視窗 11:00 ~ 11:10 的資料全部被接收完)

有序事件

假設在完美的條件下,資料都是嚴格有序,那麼此時,流式計算引擎是可以正確計算出每個視窗的資料的。

大資料-flink-watermarks遲到資料怎麼處理?

無序事件

但是現實中,資料可能會因為各種各樣的原因(系統延遲,網路延遲等)不是嚴格有序到達系統,甚至有的資料還會遲到很久,此時 Flink 需要有一種機制,允許資料可以在一定範圍內亂序。

這種機制就是水印。

大資料-flink-watermarks遲到資料怎麼處理?

如上面,有一個引數: MaxOutOfOrderness = 4,為最大亂序時間,意思是可以允許資料在多少範圍內亂序,可以是 4 分鐘,4 個小時 等。

水印的生成策略是,當前視窗最大事件時間戳減去 MaxOutOfOrderness 的值。

如上圖,事件 7 會產生一個 w(3) 的水印,事件 11 會產生要給 w(7) 的水印,但是事件 9 ,是小於事件 11 的,此時不會觸發水印的更新。事件 15 會產生一個 w(11) 的水印。 也就是說,水印反映了事件的整體流轉的趨勢,只會上升,不會下降。

水印表示了所有小於水印值的事件都已經到達了視窗。

每當有新的最大時間戳出現時,就會產生新的 watermark。

遲到事件

對於事件時間小於水印時間的事件,稱為遲到事件。遲到事件是不會被納入視窗統計的。

大資料-flink-watermarks遲到資料怎麼處理?

如下圖,21 的事件進入系統之後,會產生 w(17) 的水印。而後來的 16 事件,由於小於當前水印時間 w(17),是不會被統計的了。

下節講如何講遲到資料旁路輸出。

關注我,每天進步一點點。

大資料-flink-watermarks遲到資料怎麼處理?

大資料-flink-watermarks遲到資料怎麼處理?