1. 程式人生 > >Flink window機制

Flink window機制

ant 訪問 設計 工具包 內存 體驗 event trigger .html

此文已由作者嶽猛授權網易雲社區發布。

歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。


問題

window是解決流計算中的什麽問題?

怎麽劃分window?有哪幾種window?window與時間屬性之間的關系?

window裏面的數據何時被計算?

window 何時被清除?

第一個問題

window是解決流計算中的什麽問題?

熟悉google dataflow模型的同學應該清楚,流計算被抽象成四個問題,what,where,when,how?

那麽window解決的是where,也就是將無界數據劃分成有界數據。

第二個問題

在說明如何劃分window之前,我們先看下流計算中有哪幾種時間概念


技術分享圖片

event time:記錄發生的時間,比如你點擊某個網站當時產生的時間

ingest time:log 進入系統的時間,比如從系統從kafka讀進記錄的時間

process time:處理時間,記錄被處理時的系統時間。

那麽window是如何劃分的呢?

答案是:

每一條記錄來了以後會根據時間屬性值采用不同的window assinger 方法分配給一個或者多個窗口。

那麽有幾種window assinger方式呢,目前來看是每種時間屬性對應三種(flink沒有基於註入時間的窗口)

1)固定窗口分配:一條記錄只屬於一個窗口

2)滑動窗口分配:一條記錄屬於多個窗口

3)會話窗口:一條記錄一個窗口

例子:

固定窗口:窗口大小是5s,key為A的數據分別在0,4999ms,5000s產生了數據,那麽形成的window如下,窗口允許等待時間為5s


技術分享圖片

滑動窗口:窗口大小為5s,滑動間隔為1s,key為A的數據分別在0,4999ms,5000s產生了數據,那麽形成的window為



技術分享圖片

session窗口: 間隔5s中,key為A的數據分別在0,4999ms,5000s產生了數據,那麽形成的window為


技術分享圖片

第三個問題,window的數據何時被計算,也就是四個問題中的第三個問題when?

解決這個問題用的方式是watermark和trigger,watermark用來標記窗口的完整性,trigger用來設計窗口數據觸發條件。一般的trigger實現是當watermark處於某種時間條件下或者窗口數據達到一定條件,窗口的數據開始計算。

舉個常見的trigger實現方式:當watermark越過window邊界,觸發窗口計算,對第一個固定窗口的三條數據。



技術分享圖片

基礎條件是:watermark和數據本身一樣作為正常的消息在流中流動。

1)windowoperator接到消息以後,首先存到state(本文使用rocksdb),存放的格式為k,v,key的格式是key + window,value是key和window對應的數據

2)註冊一個timer,timer的數據結構為【key,window,window邊界 - 1】,將timer放到集合中去。

3)當windowoperator收到watermark以後,取出集合中小於watermark的timer,觸發其window。觸發的過程中將state裏面對應key及window的數據取出來,這裏要經過序列化的過程,發送給windowfunction計算。

4)數據發送給windowfunction,實現windowfunction的window數據計算邏輯

對於固定窗口,當watermark大於5000的時候,(A,0),(A,4999)會被計算,當watermark大於9999的時候,(A,5000)會被計算

最後一個問題。如果window一直存在,那麽勢必會造成不必要的內存和磁盤浪費

那麽window什麽時候被清除呢?

每個window都會註冊一個cleantime,cleantime代表這個window的存活時間,cleantime = window maxtime + 窗口允許的最大延遲

當watermark > cleanTime的時候,該窗口會被清除,對應的狀態也會被清除。對於固定窗口的例子,形成的cleantimer為


技術分享圖片

當5000 < watermark < 9999的時候,窗口timewindow(0,5000)會被計算不會被清除

當9999 < watermark < 14999的時候,窗口timewindow(5000,10000)會被計算但是不會被清除,清除timewindow(0,5000)

只有watermark 》 14999的時候,清除timewindow(5000,10000)

最後有幾個問題?

假如5000 < watermark < 9999,又有timewindow(0, 5000)的延遲數據過來,那麽該怎麽處理呢?


免費體驗雲安全(易盾)內容安全、驗證碼等服務

更多網易技術、產品、運營經驗分享請點擊。





相關文章:
【推薦】 爬蟲開發python工具包介紹 (3)
【推薦】 MongoDB之我是怎麽成為Primary節點的

Flink window機制