1. Flink的Window類型
Flink基本分有3種window類型:CountWindow,TimeWindow和SessionWindow。
其中,CountWindow和TimeWindow還有滑動與滾動區(qū)分。
通常,window的api定義形式為:
stream
.keyBy(...)
.window(...) // timeWindow,countWindow,SessionWindows.withGap(Time.minutes(10))
[.trigger(...)]
[.evictor(...)]
[.allowedLateness()]
.reduce/fold/apply()
2.窗口函數(shù)有哪些
定義完窗口分配器后揖庄,需要指定在每個窗口上執(zhí)行的計算,這就是窗口函數(shù)的職責欠雌。
在了解有哪些窗口函數(shù)之前蹄梢,有必要了解Window的聚合分類:
全量聚合:簡單點說是等屬于窗口的數(shù)據(jù)到齊之后,才開始進行聚合計算;即全量聚合在未觸發(fā)之前禁炒,會保存之前的狀態(tài)而咆,在最后窗口觸發(fā)時,才會進行計算幕袱。(所以全量聚合的壓力會很大暴备。)
常見的窗口函數(shù):
apply(WindowFunction) --- 不過1.3之后被棄用
process(processWindowFunction)
增量聚合:窗口每進入一條數(shù)據(jù),就進行一次計算们豌。
reduce(reduceFunction)涯捻;
fold;
aggregate(aggregateFunction)望迎;
sum(key)障癌;min(key);max(key)
sumBy(key)辩尊;minBy(key)涛浙;maxBy(key)
我們需要根據(jù)業(yè)務(wù)場景需要,決定使用是全量聚合還是增量聚合摄欲,并進一步選擇使用哪一種聚合函數(shù)轿亮。
3.Window何時會被觸發(fā)
Window何時被觸發(fā)計算,是由觸發(fā)器Trigger的onElement方法所決定蒿涎。
該方法的參數(shù):
(1)element:到達的元素
(2)timestamp:元素達到的時間戳
(3)window:元素將被分配的窗口
(4)context:上下文
以時間類型設(shè)置為EventTime之后哀托,觸發(fā)器就是EventTimeTrigger惦辛,對應(yīng)的onElement方法:
方法很簡單:如果當前的watermark已經(jīng)大于或等于窗口的最大時間戳(即窗口的endTime)劳秋,那么就會觸發(fā)窗口計算,并輸出結(jié)果胖齐。
TriggerResult.FIRE:窗口計算并輸出結(jié)果玻淑,盡管未清除窗口,但保留了所有元素呀伙。
否則的話补履,就是注冊一個以窗口的最大時間戳為時間的定時器。
window.maxTimestamp()
這里的end是指窗口的結(jié)束時間剿另,通常是在WindowAssigner中指定箫锤,WindowAssigner有:
以TumblingEventTimeWindows為例: