Flink WaterMaker詳解

什么是 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ù)亂序問題

形象說明

  1. 假設(shè)我們現(xiàn)在是5s觸發(fā)一個窗口計算
  2. 假設(shè)不加水印, 當(dāng) 6s的事件到達,則會觸發(fā)[0,5)的窗口計算
  3. 此時如果有 4s的事件來了,則該事件將不會被處理。
  4. 當(dāng)我們加上延時2s的水位線,6s的事件來了, 6s的事件會被放在 [5,10)的窗口,
    其計算的水位在 6-2=4s。此時Flink觸發(fā)窗口的計算會依據(jù) 水位線來,
    也就是說不會觸發(fā)[0,5)的窗口。
  5. 此時如果再來一個 4s的事件,其依然會被正常加入到[0,5)的窗口,
    但是水位線我們一般需要設(shè)置成遞增,所以水位線應(yīng)該還是在4s而不是 4-2=2s
  6. 當(dāng) 7s的事件 到來,水位線變成7-2=5s,則Flink認(rèn)為之后都不會再來 5s之前的數(shù)據(jù)了,
    于是其就可以計算并關(guān)閉[0,5)的窗口。
  7. 所以我們可以看到,延時之后,4s的事件被正常處理了,
    這就是水位線存在的意義。
  8. 但是水位線無法完全解決亂序問題,
    其主要還是為了緩解亂序。
    理論上,沒有辦法通過Flink做到完全解決亂序問題,
    但是通過 allowedLateness側(cè)輸出流 的方式
    根據(jù)實際業(yè)務(wù)可以達到業(yè)務(wù)上面的完全順序

WaterMaker的傳遞

因為Flink是分布式并行計算的,
所以水位的傳遞不是線性那么簡單

image.png

這是一張官網(wǎng)的圖,我們來解讀一下加深理解。

  1. 首先圖中的Task代表著Flink SubTask
    也就是圖中最大的方框
  2. 每個Task里面會為上游發(fā)送來的流準(zhǔn)備一個分區(qū)
    所以大方框的小方框代表的是每個分區(qū)里面的 WaterMaker,
    也就是上游的waterMaker
  3. 單個分區(qū)里面的WaterMaker是遞增的,
    接收到新的WaterMarker就會更新
  4. Task的WaterMarker 是該Taks所有分區(qū)最低的WaterMarker。
  5. 下游Task接受到的是上游Task的 WaterMarker廣播出來的。
    也就是上游Task所有分區(qū)中最低的WaterMarker
  6. 所以看到第一個圖,Task接受4個上游Task來的數(shù)據(jù),
    分別為他們存在四個分區(qū)里面 2 ,4 ,3 ,6,
    而本身的 WaterMarker則是最低的 2。
    其廣播給下游的三個Task的 WaterMarker 都是2.
    2,3,4圖類似....

WaterMarker 實踐

恩恩恩~~~~這部分就省略了....
隨便翻翻都有一堆.....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容