Flink window機制
此文已由作者嶽猛授權網易雲社區發布。
歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。
問題
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機制