Flink中的時間和窗口
在傳統(tǒng)的批處理系統(tǒng)中,我們可以等到一批數據全部都到齊了之后,對其做相關的計算;但是在實時處理系統(tǒng)中,數據是源源不斷的,正常情況下,我們就得來一條處理一條。那么,我們應該如何統(tǒng)計某個實時數據源中最近一段時間內的數據呢?
在Flink的觀念中,引入了“窗口”的概念。所謂的“窗口”,一般就是劃定的一段時間范圍,也就是“時間窗”;對在這范圍內的數據進行處理,就是所謂的窗口計算。所以窗口和時間往往是分不開的。
一、窗口(Window)
1.正確的理解窗口
簡單來說,Flink是一個流式計算引擎,主要用來處理無界數據流的,數據源源不斷、無窮無盡,想要方便高效的處理這種無界數據流,一種方式就是將這種無界數據劃分為多個有界的"數據塊",這其實就是窗口(Window)。
Flink中的窗口并不是提前創(chuàng)建好了的,而是動態(tài)創(chuàng)建的,當有落在這個窗口區(qū)間范圍 的數據達到時,才創(chuàng)建對應的窗口。另外,這里我們認為到達窗口結束時間時,窗口就觸發(fā)計算并關閉,事實上“觸發(fā)計算”和“窗口關閉”兩個行為也可以分開。
2.窗口的分類
1)按照驅動類型分
窗口本身是截取有界數據的一種方式,所以窗口一個非常重要的信息其實就是“怎樣截取數據”。換句話說, 就是以什么標準來開始和結束數據的截取,我們把它叫作窗口的“驅動類型”。
(1)時間窗口(Time Window)
時間窗口以時間點來定義窗口的開始(start)和結束(end),所以截取出的就是某一時間段的數據。到達結束時間時,窗口不再收集數據,觸發(fā)計算輸出結果,并將窗口關閉銷毀。
(2)計數窗口(Count Window)
計數窗口基于元素的個數來截取數據,到達固定的個數時就觸發(fā)計算并關閉窗口。每個窗口截取數據的個數, 就是窗口的大小。
通過上面的圖我們可以看到,時間窗口的時間固定,計數窗口的計數固定。
其實,到這里,我們可以進一步正確的理解窗口,在Flink中,窗口其實并不是一個“框”,它更加像一個“桶”,在Flink中,窗口可以把流切割為有限大小的多個“存儲桶”(bucket),流中的每一個數據都會進入到對應的桶中,當窗口的結束時間到達時,就會關閉桶并且對桶中的數據進行收集計算,也就是所謂的窗口計算。
2)按照窗口分配數據的規(guī)則分類
根據分配數據的規(guī)則,窗口的具體實現可以分為 4 類:滾動窗口(Tumbling Window)、 滑動窗口(Sliding Window)、會話窗口(Session Window),以及全局窗口(Global Window)。
滾動窗口(Tumbling Window)
滾動窗口可以基于時間定義,也可以基于數據個數定義;需要的參數只有一個, 就 是 窗 口 的 大 小 ( window size)。比如我們可以定義一個長度為1小時的滾動時間窗口, 那么每個小時就會進行一次統(tǒng)計;或者定義一個長度為10的滾動計數窗口,就會每10個數進行一次統(tǒng)計。
可以看出,滾動窗口的應用非常廣泛,它可以對每個時間段的數據做統(tǒng)計計算。
滑動窗口(Sliding Window)
滑動窗口的大小也是固定的。但是窗口之間并不是首尾相接的,而是可以“錯開”一定的位置。 定義滑動窗口的參數有兩個:除去窗口大小(window size)之外,還有一個“滑動步長”(window slide), 它其實就代表了窗口計算的頻率。窗口在結束時間觸發(fā)計算輸出結果,那么滑動步長就代表了計算頻率。
當滑動步長小于窗口大小時,滑動窗口就會出現重疊, 這時數據也可能會被同時分配 到多個窗口中。而具體的個數, 就由窗口大小和滑動步長的比 值(size/slide)來決定。 滾動窗口也可以看作是一 種特殊的滑動窗口——窗口大小等于滑動步長(size = slide)。 滑動窗口適合計算結果更新 頻率非常高的場景。
相比滾動窗口而言,滾動窗口可以做每個時間段的計算,滑動窗口就更適合做最近一個時間段的計算。
會話窗口(Session Window)
會話窗口,是基于“會話”(session)來來對數據進行分組的。會話窗口只能基于時間來定義。 會話窗口中,最重要的參數就是會話的超時時間,也就是兩個會話窗口之間的最小距離。如果相鄰兩個數據到來的時間間隔(Gap)小于指定的大?。╯ize),那說明還在保持會話,它們就屬于同一個窗口;如果gap大于size, 那么新來的數據就應該屬于新的會話窗口,而前一個窗口就應該關閉了。
會話窗口的長度不固定, 起始和結束時間也是不確定 的,各個分區(qū)之間窗口沒有 任何關聯。會話窗口之間一 定是不會重疊的,而且會留 有至少為size的間隔(session gap)。在一些類似保持會話的場 景下,可以使用會話窗口來進 行數據的處理統(tǒng)計。
全局窗口(Global Windows)
“全局窗口”,這種窗口全局有效,會把相同key的所有數據都分配到同一個窗口中。這種窗口沒有結束的時候, 默認是不會做觸發(fā)計算的。如果希望它能對數據進行計算處理,還需要自定義“觸發(fā)器”(Trigger)。
全局窗口沒有結束的 時間點,所以一般在希望 做更加靈活的窗口處理時 自定義使用。Flink中的計數窗口(Count Window), 底層就是用全局窗口實現的。文章來源:http://www.zghlxwxcb.cn/news/detail-719391.html
二、時間語義
到底是以那種時間作為衡量標準,就是所謂的“時間語義”。
在實際應用中,事件時間語義會更為常見。一般情況下,業(yè)務日志數據中都會記錄數據生成的時間戳(timestamp),它就可以作為事件時間的判斷基礎。 在 Flink 中,由于處理時間比較簡單,早期版本默認的時間語義是處理時間;而考慮到事件時間在實際應用中更為廣泛,從 Flink1.12 版本開始,Flink 已經將事件時間作為默認的時間語義了。文章來源地址http://www.zghlxwxcb.cn/news/detail-719391.html
到了這里,關于Flink中的時間和窗口的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!