零基础学Flink:Window Watermark
在上一篇?文章?中,我們學習了flink的時間。 本文我們來一起研究下 window 和 watermark 。
Window
首先,window是無界流數(shù)據(jù)處理的關鍵,flink將無界流拆分成無數(shù)個window。并對其生命周期進行了定義:
In a nutshell, a window is?created?as soon as the first element that should belong to this window arrives, and the window is?completely removed?when the time (event or processing time) passes its end timestamp plus the user-specified?allowed lateness?(see?Allowed Lateness).?
一個窗口會在屬于其的第一個元素進入的時被創(chuàng)建,當時間(事件時間或處理時間)超過其結(jié)束時間加上用戶允許的延遲時間后,該窗口被移除。
在flink官方將窗口分為滾動窗口(Tumbling Windows),滑動窗口(Sliding?Windows),會話窗口(Session?Windows),全局窗口(Global?Windows)。全局窗口是一種特殊類型的窗口,不在今天咱們討論的范圍之內(nèi)。
滾動窗口:滾動窗口分派器(assigner)會將數(shù)據(jù)元素分派給指定大小的窗口,滾動窗口尺寸固定,相互不會重疊。
滑動窗口:滑動窗口分派器將元素分派給固定長度的窗口。與滾動窗口分派器類似,窗口大小可由參數(shù)配置。還有另外一個參數(shù)控制滑動窗口的啟動頻率。因此,如果滑動窗口小于窗口大小,則滑動窗口可以重疊。在這種情況下,元素被分配到多個窗口。如果滑動窗口大于窗口大小,則窗口變成抽樣數(shù)據(jù)。
會話窗口:會話窗口分派器按活動會話對元素進行分組。與滾動窗口和滑動窗口相比,會話窗口不重疊,也沒有固定的開始和結(jié)束時間。當會話窗口在一段時間內(nèi)不接收元素時(即,當出現(xiàn)不活動間隙時),它將關閉。
下圖,是我認為描述窗口最為清晰的一張了。
這張圖,需要從下往上看,最下面定義了原始數(shù)據(jù)的輸入流,即在第一分鐘進入2個數(shù)據(jù)96,第二分鐘進入848,以此類推。
倒數(shù)第二行,是一個固定時間的滾動窗口,其窗口大小為1分鐘。
倒數(shù)第三行,是一個滑動窗口,需要數(shù)據(jù)滑動窗口的窗口尺寸和滑動尺寸。
倒數(shù)第四行,是一個固定元素個數(shù)的滾動窗口,即每3個元素一滾。
最上面則是一個會話窗口,只要會話有間隙,就會重新構(gòu)建窗口。
Watermark
通過上面一章的內(nèi)容,我們可以看出每個窗口都會有開始時間和結(jié)束時間(一般window的時間窗口為左閉右開的區(qū)間范圍),在這段時間內(nèi),我們是否能拿到所有需要處理的數(shù)據(jù),我們就需要watermark來配合了,在之前的文章里,由于理解的原因,我推薦過大家使用翻譯水印,但是現(xiàn)在,我覺得還是叫水位線更合適一些。
這里引用阿里云棲的一段描述
Watermark是Apache Flink為了處理EventTime 窗口計算提出的一種機制,本質(zhì)上也是一種時間戳,由Apache Flink Source或者自定義的Watermark生成器按照需求Punctuated或者Periodic兩種方式生成的一種系統(tǒng)Event,與普通數(shù)據(jù)流Event一樣流轉(zhuǎn)到對應的下游算子,接收到Watermark Event的算子以此不斷調(diào)整自己管理的EventTime clock。 Apache Flink 框架保證Watermark單調(diào)遞增,算子接收到一個Watermark時候,框架知道不會再有任何小于該Watermark的時間戳的數(shù)據(jù)元素到來了,所以Watermark可以看做是告訴Apache Flink框架數(shù)據(jù)流已經(jīng)處理到什么位置(時間維度)的方式。??Watermark的產(chǎn)生和Apache Flink內(nèi)部處理邏輯如下圖所示:?
從上文中,我們可以得出兩個觸發(fā)watermark的必要條件
watermark時間 >=?窗口的結(jié)束時間
在窗口的時間范圍(左閉右開)內(nèi)有數(shù)據(jù)
那么,flink是如何避免數(shù)據(jù)亂流的呢?我們來看下面一張圖
這是一個典型的單通道的場景,首先我們有一個時間事件隊列{2,3,1,7,3,5,9,6,12} ,兩個wartermark(W4,W9)事件通過時間戳被指派給了窗口(T1-T4)。
數(shù)據(jù)流入2,3,1進入窗口,7不屬于當前事件窗口,所以指派給了新窗口(T4-T8)。
數(shù)據(jù)繼續(xù)流入,此時水位線到達W4,觸發(fā)窗口(T1-T4)計算。
數(shù)據(jù)繼續(xù)流入,9被指派給了新窗口(T9-T12)(*筆者注,這個圖的事件窗口不對,個人認為是T8-T12)
關于多通道的場景,我也推薦云棲的這張圖,比官方文檔里的要好理解一些,配合上面的案例,相信大家也能讀懂。
現(xiàn)在我們已經(jīng)了解watermark是如何工作的,那么它是如何產(chǎn)生的呢?在flink里主要有兩種方式產(chǎn)生watermark,即周期性的(Periodic)和標記性的(Punctuated)
Punctuated:數(shù)據(jù)流中每一個遞增的EventTime都會產(chǎn)生一個Watermark。?
Periodic:周期性的(一定時間間隔或者達到一定的記錄條數(shù))產(chǎn)生一個Watermark。在實際的生產(chǎn)中Periodic的方式必須結(jié)合時間和積累條數(shù)兩個維度繼續(xù)周期性產(chǎn)生Watermark,否則在極端情況下會有很大的延時。
所以Watermark的生成方式需要根據(jù)業(yè)務場景的不同進行不同的選擇。
好了,關于 window 和 watermark 就暫時說到這了,僅代表個人理解,如有問題,望指正,歡迎轉(zhuǎn)載,著名出處。
后續(xù),會整理一些DEMO與大家分享。
最后,強烈推薦大家讀一讀云棲的那篇文章,本文也是節(jié)選了部分。
參考資料:
https://yq.aliyun.com/articles/666056
https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/operators/windows.html
https://ci.apache.org/projects/flink/flink-docs-release-1.7/dev/event_timestamps_watermarks.html
https://blog.csdn.net/u4110122855/article/details/81360381
總結(jié)
以上是生活随笔為你收集整理的零基础学Flink:Window Watermark的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深信服上网行为管理 准入规则库介绍
- 下一篇: 高用户体验,减少跳出率