2021年大数据Flink(十八):Flink Window操作
目錄
???????Flink-Window操作
為什么需要Window
Window的分類
按照time和count分類
???????按照slide和size分類
???????總結
Window的API
window和windowAll
???????WindowAssigner
???????evictor--了解
???????trigger--了解
API調用示例
Flink-Window操作
為什么需要Window
在流處理應用中,數(shù)據(jù)是連續(xù)不斷的,有時我們需要做一些聚合類的處理,例如:在過去的1分鐘內有多少用戶點擊了我們的網(wǎng)頁。
在這種情況下,我們必須定義一個窗口(window),用來收集最近1分鐘內的數(shù)據(jù),并對這個窗口內的數(shù)據(jù)進行計算。
?
?
?
Window的分類
按照time和count分類
time-window:時間窗口:根據(jù)時間劃分窗口,如:每xx分鐘統(tǒng)計最近xx分鐘的數(shù)據(jù)
count-window:數(shù)量窗口:根據(jù)數(shù)量劃分窗口,如:每xx個數(shù)據(jù)統(tǒng)計最近xx個數(shù)據(jù)
?
?
???????按照slide和size分類
窗口有兩個重要的屬性: 窗口大小size和滑動間隔slide,根據(jù)它們的大小關系可分為:
tumbling-window:滾動窗口:size=slide,如:每隔10s統(tǒng)計最近10s的數(shù)據(jù)
?
sliding-window:滑動窗口:size>slide,如:每隔5s統(tǒng)計最近10s的數(shù)據(jù)
?
注意:當size<slide的時候,如每隔15s統(tǒng)計最近10s的數(shù)據(jù),那么中間5s的數(shù)據(jù)會丟失,所有開發(fā)中不用
???????總結
按照上面窗口的分類方式進行組合,可以得出如下的窗口:
1.基于時間的滾動窗口tumbling-time-window--用的較多
2.基于時間的滑動窗口sliding-time-window--用的較多
3.基于數(shù)量的滾動窗口tumbling-count-window--用的較少
4.基于數(shù)量的滑動窗口sliding-count-window--用的較少
注意:Flink還支持一個特殊的窗口:Session會話窗口,需要設置一個會話超時時間,如30s,則表示30s內沒有數(shù)據(jù)到來,則觸發(fā)上個窗口的計算
?
Window的API
window和windowAll
?
?
n使用keyby的流,應該使用window方法
n未使用keyby的流,應該調用windowAll方法
???????WindowAssigner
window/windowAll?方法接收的輸入是一個 WindowAssigner, WindowAssigner 負責將每條輸入的數(shù)據(jù)分發(fā)到正確的 window 中,
Flink提供了很多各種場景用的WindowAssigner:
?
如果需要自己定制數(shù)據(jù)分發(fā)策略,則可以實現(xiàn)一個 class,繼承自 WindowAssigner。
?
???????evictor--了解
evictor 主要用于做一些數(shù)據(jù)的自定義操作,可以在執(zhí)行用戶代碼之前,也可以在執(zhí)行
用戶代碼之后,更詳細的描述可以參考org.apache.flink.streaming.api.windowing.evictors.Evictor 的 evicBefore 和 evicAfter兩個方法。
Flink 提供了如下三種通用的 evictor:
* CountEvictor 保留指定數(shù)量的元素
* TimeEvictor 設定一個閾值 interval,刪除所有不再 max_ts - interval 范圍內的元
素,其中 max_ts 是窗口內時間戳的最大值。
* DeltaEvictor 通過執(zhí)行用戶給定的 DeltaFunction 以及預設的 theshold,判斷是否刪
除一個元素。
?
???????trigger--了解
trigger 用來判斷一個窗口是否需要被觸發(fā),每個 WindowAssigner 都自帶一個默認的trigger,
如果默認的 trigger 不能滿足你的需求,則可以自定義一個類,繼承自Trigger 即可,我們詳細描述下 Trigger 的接口以及含義:
* onElement() 每次往 window 增加一個元素的時候都會觸發(fā)
* onEventTime() 當 event-time timer 被觸發(fā)的時候會調用
* onProcessingTime() 當 processing-time timer 被觸發(fā)的時候會調用
* onMerge() 對兩個 `rigger 的 state 進行 merge 操作
* clear() window 銷毀的時候被調用
上面的接口中前三個會返回一個 TriggerResult, TriggerResult 有如下幾種可能的選
擇:
* CONTINUE 不做任何事情
* FIRE 觸發(fā) window
* PURGE 清空整個 window 的元素并銷毀窗口
* FIRE_AND_PURGE 觸發(fā)窗口,然后銷毀窗口
?
API調用示例
?
source.keyBy(0).window(TumblingProcessingTimeWindows.of(Time.seconds(5)));
或
source.keyBy(0)..timeWindow(Time.seconds(5))
總結
以上是生活随笔為你收集整理的2021年大数据Flink(十八):Flink Window操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据Flink(十七):Fl
- 下一篇: 2021年大数据Flink(十九):案例