Flink中,升序流水印的案例實現(xiàn)(附詳細代碼)
Watermark的使用情況
本來有序的Stream中的 Watermark
如果數(shù)據(jù)元素的事件時間是有序的,Watermark 時間戳會隨著數(shù)據(jù)元素的事件時間按順序生成,此時水位線的變化和事件時間保持一致(因為既然是有序的時間,就不需要設(shè)置延遲了,那么t就是 0。所以 watermark=maxtime-0 = maxtime),也就是理想狀態(tài)下的水位線。當 Watermark 時間大于 Windows 結(jié)束時間就會觸發(fā)對 Windows 的數(shù)據(jù)計算,以此類推, 下一個 Window 也是一樣。這種情況其實是亂序數(shù)據(jù)的一種特殊情況。
亂序事件中的Watermark
現(xiàn)實情況下數(shù)據(jù)元素往往并不是按照其產(chǎn)生順序接入到 Flink 系統(tǒng)中進行處理,而頻繁出現(xiàn)亂序或遲到的情況,這種情況就需要使用 Watermarks 來應對。
有序流中的水?。ㄉ颍?/strong>
升序流水印概念
事件是有序的(按照他們自己的時間戳來看),watermark是流中簡單的周期性的標記。
升序的底層實現(xiàn)
底層調(diào)用的也是 亂序的 watermark生成器,只是 亂序程度 傳了一個?0ms
watermark = maxTimestamp - outOfOrdernessMillis - 1
? ? ? ? ? ? ? ? ? = maxTimestamp - 0ms -1 ms
? ? ? ? ? ? ? ? ?=> 事件時間 - 1ms
需求
從socket獲取數(shù)據(jù),來計算傳感器水位信息
開發(fā)步驟
1.定義類 WaterSensor? String id; Long ts; Integer vc;?
2.創(chuàng)建流執(zhí)行環(huán)境
3.獲取socket文本數(shù)據(jù)
4.將字符串數(shù)據(jù)切分成 WaterSensor 對象數(shù)據(jù)
5.分配水印機制,單調(diào)遞增
6.分配后的數(shù)據(jù)根據(jù)id進行分組
7.設(shè)置滾動事件時間窗口,時間為10秒
8.對開窗數(shù)據(jù)進行process
9.打印輸出
10.執(zhí)行流環(huán)境
參考代碼
