一、窗口(window)
(1)一般真實的流都是無界的,怎樣處理無界的數據?
(2)可以把無限的數據流進行切分,得到有限的數據集進行處理——也就是得到有界流;
(3)窗口(window)就是將無限流切割爲有限流的一種方式,它會將流數據分發到有限大小的桶(bucket)中進行分析;
二、window類型
(1)時間窗口(Time Window):滾動時間窗口,滑動時間窗口,會話窗口;
(2)計數窗口(Count Window):滾動計數窗口,滑動計數窗口;
1、滾動窗口(Tumbling Windows)
1)將數據依據固定的窗口長度對數據進行切分;
2)時間對齊,窗口長度固定,沒有重疊;
2、滑動窗口(Sliding Windows)
1)滑動窗口是固定窗口更廣義的一種形式,滑動窗口由固定的窗口長度和滑動間隔組成;
2)窗口長度固定,可以重疊;
3、會話窗口(Session Windows)
1)由一系列事件組合一個指定時間長度的timeout間隙組成,也就是一段時間沒有接收到新數據就會生成新的窗口;
2)特點:時間無對齊
三、window API
1、窗口分配器——window()方法
1)我們可以用.window()來定義一個窗口,然後基於這個window去做一些聚合或者其它處理操作。注意window()方法必須在keyBy之後才能用。
2)Flink提供了更加簡單的.timeWindow和.countWindow方法,用於定義時間窗口和計數窗口。
2、窗口分配器(window assigner)
1) window()方法接收的輸入參數是一個WindowAssigner;
2)WindowAssigner負責將每條輸入的數據分發到正確的window中;
3)Flink提供了通用的WindowAssigner:滾動窗口(tumbling window)、滑動窗口(sliding window)、會話窗口(session window)、全局窗口(global window);
3、創建不同類型的窗口
1)滾動時間窗口(tumbling time window):
.timeWindow(Time.seconds(15))
2)滑動時間窗口(sliding time window)
.timeWindow(Time.seconds(15),Time.seconds(5))
3)會話窗口(session window)
.window(EventTimeSessionWindows.withGap(Time.minutes(10)))
4)滾動計數窗口(tumbling count window)
.countWindow(5)
5)滑動計數窗口(sliding count window)
.countWindow(10,2)
4、窗口函數(window function)
(1)window function定義了要對窗口中收集的數據做的計算操作;
(2)可以分爲兩類:
1)增量聚合函數(incremental aggregation functions)
*****每條數據到來就進行計算,保持一個簡單的狀態;
*****ReduceFunction,AggregateFunction
2)全窗口函數(full window functions)
*****先把窗口所有數據收集起來,等到計算的時候會遍歷所有數據;
*****ProcessWindowFunction
5、其它可選API
(1).trigger()——觸發器
*****定義window什麼時候關閉,觸發計算並輸出結果;
(2).evictor()——移除器
*****定義移除某些數據的邏輯
(3).allowedLateness()——允許處理遲到的數據
(4).slideOutputLateData()——將遲到的數據放入側輸出流
(5).getSideOutput()——獲取側輸出流
window API 總覽