什么是 WaterMaker
WaterMaker 水位線在很多地方都有應(yīng)用,
其含義也不盡相同,
在Flink中,水位線是用來觸發(fā)窗口計算的
其本質(zhì)相當(dāng)于一個flink流中的一個 帶時間戳的Event,
Flink在處理這個特殊 Event 的時候,
會認(rèn)為該 Event攜帶的時間戳之前時間的所有數(shù)據(jù)都已經(jīng)到了。
因此根據(jù)這個特性會觸發(fā)相關(guān)窗口的計算邏輯。
WaterMaker有什么用
主要就是用來解決數(shù)據(jù)亂序問題
形象說明
- 假設(shè)我們現(xiàn)在是5s觸發(fā)一個窗口計算
- 假設(shè)不加水印, 當(dāng) 6s的事件到達,則會觸發(fā)[0,5)的窗口計算
- 此時如果有 4s的事件來了,則該事件將不會被處理。
- 當(dāng)我們加上延時2s的水位線,6s的事件來了, 6s的事件會被放在 [5,10)的窗口,
其計算的水位在6-2=4s。此時Flink觸發(fā)窗口的計算會依據(jù) 水位線來,
也就是說不會觸發(fā)[0,5)的窗口。 - 此時如果再來一個 4s的事件,其依然會被正常加入到[0,5)的窗口,
但是水位線我們一般需要設(shè)置成遞增,所以水位線應(yīng)該還是在4s而不是4-2=2s - 當(dāng) 7s的事件 到來,水位線變成
7-2=5s,則Flink認(rèn)為之后都不會再來 5s之前的數(shù)據(jù)了,
于是其就可以計算并關(guān)閉[0,5)的窗口。 - 所以我們可以看到,延時之后,4s的事件被正常處理了,
這就是水位線存在的意義。 - 但是水位線無法完全解決亂序問題,
其主要還是為了緩解亂序。
理論上,沒有辦法通過Flink做到完全解決亂序問題,
但是通過allowedLateness和側(cè)輸出流的方式
根據(jù)實際業(yè)務(wù)可以達到業(yè)務(wù)上面的完全順序
WaterMaker的傳遞
因為Flink是分布式并行計算的,
所以水位的傳遞不是線性那么簡單

image.png
這是一張官網(wǎng)的圖,我們來解讀一下加深理解。
- 首先圖中的Task代表著Flink SubTask
也就是圖中最大的方框 - 每個Task里面會為上游發(fā)送來的流準(zhǔn)備一個分區(qū)
所以大方框的小方框代表的是每個分區(qū)里面的 WaterMaker,
也就是上游的waterMaker - 單個分區(qū)里面的WaterMaker是遞增的,
接收到新的WaterMarker就會更新 - Task的WaterMarker 是該Taks所有分區(qū)最低的WaterMarker。
- 下游Task接受到的是上游Task的 WaterMarker廣播出來的。
也就是上游Task所有分區(qū)中最低的WaterMarker - 所以看到第一個圖,Task接受4個上游Task來的數(shù)據(jù),
分別為他們存在四個分區(qū)里面 2 ,4 ,3 ,6,
而本身的 WaterMarker則是最低的 2。
其廣播給下游的三個Task的 WaterMarker 都是2.
2,3,4圖類似....
WaterMarker 實踐
恩恩恩~~~~這部分就省略了....
隨便翻翻都有一堆.....