Flink時間語義
Event Time
指的是資料流中每個元素或者每個事件自帶的時間屬性,一般是事件發生的時間
由於延遲有可能一個較早完成的事件晚一些到達,在開窗的時候我們不可能一直等待視窗內應該到達的所有資料
在實際應用中,當涉及到對事件按照時間視窗進行統計時,Flink會將視窗內的事件快取下來,直到接受到一個Watermark
如何使用:
- 使用Event Time作為時間戳
- 生成Watermark
Watermark:在開窗接受資料的時候,Flink會等待一個有限的時間,假設在這之後不會有更晚的資料到達。
在一定程度上降低了計算結果的絕對準確性,且增加了系統的延遲
優點:
- 某個事件的時間是確定的,保證計算結果在一定程度上的可預測性
缺點:
- 快取較大,增加了延遲,除錯和定位問題更復雜
Processing Time
指的是,運算元使用當前機器的系統時鐘時間
無視事件本身的時間屬性,只要該事件在某個時間段到達了某個運算元,就會被歸結到該視窗下
優點:
- 只依賴當前執行機器的系統時鐘,不需要依賴Watermark
- 無需快取
- 實現簡單,延遲最小
缺點:
不同環境下時間視窗的計算結果會發生變化,所以Processing Time在時間視窗下的計算會有不確定性
Ingestion Time
Ingestion Time是事件到達Flink Source的時間。從Source到下游各個運算元中間可能有很多計算環節,任何一個運算元的處理速度快慢可能影響到下游運算元的Processing Time。而Ingestion Time定義的是資料流最早進入Flink的時間,因此不會被運算元處理速度影響。
Ingestion Time通常是Event Time和Processing Time之間的一個折中方案。比起Event Time,Ingestion Time可以不需要設定複雜的Watermark,因此也不需要太多快取,延遲較低。比起Processing Time,Ingestion Time的時間是Source賦值的,一個事件在整個處理過程從頭至尾都使用這個時間,而且後續運算元不受前序運算元處理速度的影響,計算結果相對準確一些,但計算成本比Processing Time稍高。