Watermark作用
在解釋storm的window之前先說明一下watermark原理。
Watermark中文翻譯為水位線更為恰當。
順序的數據從源頭開始發送到到操作,中間過程肯定會出現數據亂序情況,比如網絡原因,數據並發發送等。如何區分亂序的數據和正常的數據,就引申出了watermark。
Watermark是每一個時間窗口的下限,意思是說當watermark大於了窗口截止時間,那么該窗口就應該被關閉。而watermar也會隨着時間窗口的變化不斷更新自己。
參考下圖,列舉了幾個關鍵的術語以及它們的定位。
watermark可以理解為自定義的可以代表整個流的時間點,並且會不斷更新。一般情況,當watermark-lastWindowEndTs>slidingInterval,那么就會觸發一個新的窗口。
lag可以理解為自定義的最大數據延遲時間范圍,由於實時計算對實時性的需求,而數據在網絡波動等情況下不是按順序到達計算,所以lag的出現就是為了解決那些能到達的數據但是時間比正常數據晚的情況,當該數據的時間小於watermark-lag。那么就判定該數據為延遲數據,可以選擇直接丟棄或者其他自定義操作。
概述
總體來看,抽象 tuple和watermark為Event,這樣可以方便的把watermark注入到tuple。做統一化處理。
有5大組件組成
·WindowBoltExecutor
·WindowManager
·WaterMarkEventGenerator
·Trigger
·Eviction
WindowBoltExecutor負責整個window的初始化,參數配置和封裝,
WindowManager負責存取數據,包括所有的數據操作
WaterMarkEventGenerator負責watermark的生成和維護
Trigger負責時間窗口的判斷,決定是否觸發窗口事件
Eviction負責數據狀態的判斷,得到數據是哪一種狀態(KEEP,STOP,PROCESS,EXPIRED)
Watermark算法
所有流數據不一起處理,而是分開計算各個流最大時間,再根據最大時間集合計算出最小時間,這個時間就是watermark的時間。
這樣做的目的是為了防止不同流傳輸的延遲不同,比方說,有2個上游A,B同時發數據,A由於網絡較好,發送的數據比B快,導致了A的時間戳比B的大,如果watermark采用了全局最大值,那么時間窗口就會被提早關閉,而B發來的數據會被排除在該時間窗口
主邏輯流程
重要參數
英文 |
解釋 |
windowLength |
窗口大小 |
slidingInterval |
窗口滑動步長 |
windowEndTs |
窗口截止時間 |
watermark |
水位線,判斷是否關閉時間窗口的標志 |
maxLag |
時間窗口的最大延遲時間(網絡等問題造成) |
eventTimestamp |
數據時間,每個數據都有自帶的時間戳 |
數據4種狀態
狀態 |
解釋 |
KEEP |
當前窗口不處理。是未來窗口的數據 |
STOP |
停止處理,數據時間戳比窗口截止時間+lag還大,說明不屬於該窗口,之后的數據也不屬於 |
PROCESS |
當前窗口內的數據 |
EXPIRE |
過期數據,需要被移除 當 窗口截止時間 – 數據時間 > 窗口大小 |