日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Flink中window 窗口和時間以及watermark水印

作者:Leo Han 更新時間: 2022-01-21 編程語言

我們都知道,Flink的核心是流式處理,但同時也支持批處理,Flink底層是一個流式引擎,在這個上面實現了流處理和批處理,而窗口則是批處理的實現。

在Flink中window從大的分類上主要有三種:Time Window(根據時間)、Count Window(根據數據量)、Session Window(會話窗口)

窗口類型有如下兩種:

  • Tumbling Window 滾動窗口,窗口之間的數據沒有重疊
  • Sliding Window 滑動窗口,窗口之間的數據有可能重疊
    在這里插入圖片描述

Count Window

Count Window主要有兩類:

  • Tumble Count Window:累積固定個數的數據就作為一個窗口,按照數據量來統計,不是按照時間,比如countWindow(100) 表示當窗口中的數據有100個的時候開始計算
  • Sliding Count Window: 累積固定個數的數據就作為一個窗口,超過指定數量個數數據開啟新一個窗口計算,比如 coutnWindow(100,10)窗口大小是100,滑動間隔是10,每增加10個元素就會對前面的100個元素計算一次

Time Window

Time Window是根據時間對數據進行分組的,

  • Tumble Time Window: 在時間上按照給定的窗口大小切分窗口,窗口之間不會重疊
  • Sliding Time Window: 在時間上按照給定的窗口大小、滑動步長切分窗口,窗口之間可能會存在數據重疊

Session Window

session window意為會話窗口,與HTTP請求的session概念類似,當超過一段時間,窗口沒有收到數據時,認為窗口結束,計算窗口內的數據,窗口之間數據不會重疊

對于TimeWindow,在Flink中有幾個時間語義:
Flink中主要有如下三種時間語義:

  • Event Time ,數據自帶的時間屬性,使用這個語義時需要指定數據中哪個字段表示該時間同事必須設置WaterMark。使用Event Time時,數據可能是亂序的。在計算時,Flink會緩存窗口內的數據直到接收到WaterMark,WaterMark假設不會有更晚的數據到達,意味著在同一個時間窗口下,Flink會等待一個有限的時間,在一定程度上降低了計算結果的絕對準確性,并且增加了系統的延遲
  • Processing Time: 數據進入某個算子,算子開始執行時的系統時間,不需要WaterMark機制,只依賴當前節點的操作系統時間
  • Ingestion Time: 數據到達Flink Source的時間,從Source到下游的各個算子中可能有多個計算環節,任何一個算子處理速度的快慢可能影響下游算子的Processing Time,而 Ingestion Time定義的是數據流入Flink的時間,不會被下游算子處理速度影響,因此Ingestion Time通常是Event Time和Processing Time的一個折中方案,Ingestion Time不需要設置復Water Mark,也不需要太多緩存,延遲較低。

在這里插入圖片描述

watermark水印

watermark一般是在Event Time語義下使用,我們知道,Event Time 是事件發生的時間,但是進入到Flink中并不一定按照EventTime順序進入,導致窗口收到的時間會存在亂序問題,這種情況下,數據可能出現亂序和延遲情況,而WaterMark就是為了解決這個問題。
我們假設窗口為滾動窗口,窗口大小為1分鐘,正常情況下,窗口如下:
窗口1 : [20212-08 08:00:00 , 20212-08 08:01:00)
窗口2: [20212-08 08:01:00 , 20212-08 08:02:00)
窗口3: [20212-08 08:02:00 , 20212-08 08:03:00)

如果有一條數據的時間時間為 20212-08 08:00:30 在 20212-08 08:01:15到達,這個時候窗口1在20212-08 08:01:00已經處理完了,按照正常情況下,這條數據會被丟棄。
采用WaterMark機制之后,比如設置MaterMark為延遲20秒,那么這時候窗口1要在 20212-08 08:01:20的是才會觸發計算,相當于這個窗口等了20秒之后才觸發計算,而在等待20s的時間內,如果在[20212-08 08:00 , 20212-08 08:01:00)在這延遲的20s能夠到達,那么也會納入窗口1的計算中。

在Flink中如果時間語義設置為Event Time:env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);的話必須設置WaterMark。

Flink中WaterMark生成方式有兩種:

  • 周期性生成,一般每隔200ms生成一個WaterMark
  • 數據流中每個數據eventTime都產生一個watermark

原文鏈接:https://blog.csdn.net/LeoHan163/article/details/122293795

欄目分類
最近更新