Flink中對窗口的支持
引:https://www.jianshu.com/p/e33a8b498ba4
1:flink支持兩種划分窗口的方式(time和count) 如果根據時間划分窗口,那么它就是一個time-window 如果根據數據划分窗口,那么它就是一個count-window
2:flink支持窗口的兩個重要屬性(size和interval)
如果size=interval,那么就會形成tumbling-window(無重疊數據)
如果size>interval,那么就會形成sliding-window(有重疊數據)
如果size<interval,那么這種窗口將會丟失數據。比如每5秒鍾,統計過去3秒的通過路口汽車的數據,將會漏掉2秒鍾的數據。
通過組合可以得出四種基本窗口:
time-tumbling-window 無重疊數據的時間窗口,設置方式舉例:timeWindow(Time.seconds(5))
time-sliding-window 有重疊數據的時間窗口,設置方式舉例:timeWindow(Time.seconds(5), Time.seconds(3))
count-tumbling-window無重疊數據的數量窗口,設置方式舉例:countWindow(5)
count-sliding-window 有重疊數據的數量窗口,設置方式舉例:countWindow(5,3)
flink支持在stream上的通過key去區分多個窗口

Tumbling Time Window
假如我們需要統計每一分鍾中用戶購買的商品的總數, 需要將用戶的行為事件按每一分鍾進行切分, 這種切分被成為翻滾時間窗口(Tumbling Time Window)。 翻滾窗口能將數據流切分成不重疊的窗口, 每一個事件只能屬於一個窗口。 // 用戶id和購買數量 stream val counts: DataStream[(Int, Int)] = ... val tumblingCnts: DataStream[(Int, Int)] = counts // 用userId分組 .keyBy(0) // 1分鍾的翻滾窗口寬度 .timeWindow(Time.minutes(1)) // 計算購買數量 .sum(1)
Sliding Time Window
我們可以每30秒計算一次最近一分鍾用戶購買的商品總數。 這種窗口我們稱為滑動時間窗口(Sliding Time Window)。 在滑窗中,一個元素可以對應多個窗口。通過使用 DataStream API,我們可以這樣實現: val slidingCnts: DataStream[(Int, Int)] = buyCnts .keyBy(0) .timeWindow(Time.minutes(1), Time.seconds(30)) .sum(1)
Tumbling Count Window
當我們想要每100個用戶購買行為事件統計購買總數,那么每當窗口中填滿100個元素了,就會對窗口進行計算,這種窗口我們稱之為翻滾計數窗口(Tumbling Count Window),上圖所示窗口大小為3個。通過使用 DataStream API,我們可以這樣實現
// Stream of (userId, buyCnts) val buyCnts: DataStream[(Int, Int)] = ... val tumblingCnts: DataStream[(Int, Int)] = buyCnts // key stream by sensorId .keyBy(0) // tumbling count window of 100 elements size .countWindow(100) // compute the buyCnt sum .sum(1)
Session Window
在這種用戶交互事件流中,我們首先想到的是將事件聚合到會話窗口中(一段用戶持續活躍的周期),由非活躍的間隙分隔開。如上圖所示,就是需要計算每個用戶在活躍期間總共購買的商品數量,如果用戶30秒沒有活動則視為會話斷開(假設raw data stream是單個用戶的購買行為流)。Session Window 的示例代碼如下
// Stream of (userId, buyCnts)
val buyCnts: DataStream[(Int, Int)] = ...
val sessionCnts: DataStream[(Int, Int)] = vehicleCnts
.keyBy(0)
// session window based on a 30 seconds session gap interval
.window(ProcessingTimeSessionWindows.withGap(Time.seconds(30)))
.sum(1)
一般而言,window 是在無限的流上定義了一個有限的元素集合。這個集合可以是基於時間的,元素個數的,時間和個數結合的,會話間隙的,或者是自定義的。Flink 的 DataStream API 提供了簡潔的算子來滿足常用的窗口操作,同時提供了通用的窗口機制來允許用戶自己定義窗口分配邏輯
