Flink中,為什么要有 Watermark?
為什么要有 Watermark?
當(dāng) flink 以?EventTime?模式處理流數(shù)據(jù)時,它會根據(jù)數(shù)據(jù)里的時間戳來處理基于時間的算子。但是由于網(wǎng)絡(luò)、分布式等原因,會導(dǎo)致數(shù)據(jù)亂序的情況。如下圖所示:

Flink中的WaterMark
只要使用event time,就必須使用watermark,在上游指定,比如:source、map算子后
基本概念
Watermark的核心本質(zhì)可以理解成一個延遲觸發(fā)機(jī)制。
我們知道,流處理從事件產(chǎn)生,到流經(jīng)source,再到operator,中間是有一個過程和時間的,雖然大部分情況下,流到operator的數(shù)據(jù)都是按照事件產(chǎn)生的時間順序來的,但是也不排除由于網(wǎng)絡(luò)、背壓等原因,導(dǎo)致亂序的產(chǎn)生,所謂亂序,就是指Flink接收到的事件的先后順序不是嚴(yán)格按照事件的Event Time順序排列的。
我們來設(shè)想一下下面這個場景:

使用時間窗口來統(tǒng)計10分鐘內(nèi)的用戶流量
有一個時間窗口
開始時間為:2017-03-19 10:00:00
結(jié)束時間為:2017-03-19 10:10:00
有一個數(shù)據(jù),因為網(wǎng)絡(luò)延遲
事件發(fā)生的時間為:2017-03-19 10:10:00
但進(jìn)入到窗口的時間為:2017-03-19 10:10:02,延遲了2秒中
時間窗口并沒有將59這個數(shù)據(jù)計算進(jìn)來,導(dǎo)致數(shù)據(jù)統(tǒng)計不正確
根據(jù)窗口計算時間的不同,這個數(shù)據(jù)都會被遺漏,只是:
如果按照處理時間來計算,這個窗口在系統(tǒng)時間大于2017-03-19 10:10:00的時候就會關(guān)閉,延遲進(jìn)來的這個59會被忽略
如果按照事件時間來計算,這個窗口當(dāng)進(jìn)入一條數(shù)據(jù),其事件時間大于2017-03-19 10:10:00的時候,會導(dǎo)致窗口關(guān)閉,同樣因為這個59延遲了,會因為別的正常順序的數(shù)據(jù)進(jìn)入Flink而導(dǎo)致屬于它的窗口被提前關(guān)閉
也就是:
處理時間窗口,按照當(dāng)前系統(tǒng)時間來判斷進(jìn)行窗口關(guān)閉
事件時間窗口,按照進(jìn)入數(shù)據(jù)的事件時間來判斷是否關(guān)閉窗口,如果進(jìn)來的一條新數(shù)據(jù)是下一個窗口的數(shù)據(jù),那么會關(guān)閉上一個窗口
總結(jié):
watermark是水印,也稱水位線。用來測量事件時間的進(jìn)度。
watermark作為數(shù)據(jù)流中的一部分在流動,并且攜帶一個時間戳t。
watermark(t) 表示這個流里面事件時間已經(jīng)到了時間t,意味著流中不應(yīng)該存在時間戳t2<=t的數(shù)據(jù)。
觸發(fā)窗口等的計算、關(guān)閉
單調(diào)遞增的(時間不能倒退)
用來處理數(shù)據(jù)亂序的問題
