1. 程式人生 > 實用技巧 >Flink中的Window

Flink中的Window

1 Window

Streaming流式計算是一種被設計用於處理無限資料集的資料處理引擎,而無限資料集是指一種不斷增長的本質上無限的資料集,而Window是一種切割無限資料理為有限塊進行處理的手段

Window是無限資料流處理的核心,Window將一個無限的Stream拆分成有限大小的”buckets”桶,我們可以在這些桶上做計算操作

Window可以分成兩類

  1. CountWindow:按照指定的資料條數生成一個Window,與時間無關

  2. TimeWindow:按照時間生成Window

    • 滾動視窗(Tumbling Windows):將資料依據固定的視窗長度對資料進行切片

      在這裡插入圖片描述

      特點:時間對齊,視窗長度固定,沒有重疊

      適用場景:適合做 BI 統計等(做每個時間段的聚合計算)

    • 滑動視窗(Sliding Windows):是固定視窗的更廣義的一種形式,滑動視窗由固定的視窗長度和滑動間隔組成

      在這裡插入圖片描述

      特點:時間對齊,視窗長度固定,可以有重疊

      適用場景:對最近一個時間段內的統計

    • 會話視窗(Session Windows):由一系列事件組合一個指定時間長度的timeout間隙組成,類似於web應用session,也就是一段時間沒有接收到新資料就會生成新的視窗

      在這裡插入圖片描述

      特點:時間無對齊

  3. Global Window:全域性視窗

2 Window API

2.1 TimeWindow

TimeWindow是將指定時間範圍內的所有資料組成一個window,一次對一個window裡面的所有資料進行計算

  1. 滾動視窗

    Flink預設的時間視窗根據Processing Time進行視窗的劃分,將Flink獲取到的資料根據進入Flink的時間劃分到不同的視窗中

    timeWindow(Time.seconds(5))

    時間間隔可以通過Time.milliseconds(x)Time.seconds(x)Time.minutes(x)等其中的一個來指定

  2. 滑動視窗

    滑動視窗和滾動視窗的函式名是完全一致的,只是在傳引數時需要傳入兩個引數,一個是window_size,一個是sliding_size

    timeWindow(Time.seconds(10), Time.seconds(5))

    時間間隔可以通過Time.milliseconds(x)

    Time.seconds(x)Time.minutes(x)等其中的一個來指定

2.2 CountWindow

CountWindow根據視窗中相同key元素的數量來觸發執行,執行時只計算元素數量達到視窗大小的key對應的結果

注意:CountWindow的window_size指的是相同Key的元素的個數,不是輸入的所有元素的總數

  1. 滾動視窗

    預設的CountWindow是一個滾動視窗,只需要指定視窗大小即可,當元素數量達到視窗大小時,就會觸發視窗的執行

    countWindow(5)

  2. 滑動視窗

    滑動視窗和滾動視窗的函式名是完全一致的,只是在傳引數時需要傳入兩個引數,一個是window_size,一個是sliding_size

    countWindow(10, 2)

2.3 Window Function

Window Function定義了要對視窗中收集的資料做的計算操作,主要可以分為兩類

  1. 增量聚合函式(incremental aggregation functions)

    每條資料到來就進行計算,保持一個簡單的狀態

    典型的增量聚合函式有ReduceFunction,AggregateFunction

  2. 全視窗函式(full window functions)

    先把視窗所有資料收集起來,等到計算的時候會遍歷所有資料

    ProcessWindowFunction就是一個全視窗函式

2.4 其它可選 API

  1. 觸發器:trigger()

    定義window什麼時候關閉,觸發計算並輸出結果

  2. 移除器:evitor()

    定義移除某些資料的邏輯

  3. allowedLateness()

    允許處理遲到的資料

  4. sideOutputLateData()

    將遲到的資料放入側輸出流

  5. getSideOutput()

    獲取側輸出流

在這裡插入圖片描述