Flink的Window类型
Flink基本分有3种window类型:CountWindow,TimeWindow和SessionWindow。 其中,CountWindow和TimeWindow还有滑动与滚动区分。
通常,window的api定义形式为:
stream
.keyBy(...)
.window(...) // timeWindow,countWindow,SessionWindows.withGap(Time.minutes(10))
[.trigger(...)]
[.evictor(...)]
[.allowedLateness()]
.reduce/fold/apply()
窗口函数有哪些
定义完窗口分配器后,需要指定在每个窗口上执行的计算,这就是窗口函数的职责。 在了解有哪些窗口函数之前,有必要了解Window的聚合分类: 全量聚合:简单点说是等属于窗口的数据到齐之后,才开始进行聚合计算;即全量聚合在未触发之前,会保存之前的状态,在最后窗口触发时,才会进行计算。(所以全量聚合的压力会很大。) 常见的窗口函数: apply(WindowFunction) --- 不过1.3之后被弃用 process(processWindowFunction)
增量聚合:窗口每进入一条数据,就进行一次计算。 reduce(reduceFunction); fold; aggregate(aggregateFunction); sum(key);min(key);max(key) sumBy(key);minBy(key);maxBy(key)
我们需要根据业务场景需要,决定使用是全量聚合还是增量聚合,并进一步选择使用哪一种聚合函数。
Window何时会被触发
Window何时被触发计算,是由触发器Trigger的onElement方法所决定。
该方法的参数: (1)element:到达的元素 (2)timestamp:元素达到的时间戳 (3)window:元素将被分配的窗口 (4)context:上下文
以时间类型设置为EventTime之后,触发器就是EventTimeTrigger,对应的onElement方法:
方法很简单:如果当前的watermark已经大于或等于窗口的最大时间戳(即窗口的endTime),那么就会触发窗口计算,并输出结果。 TriggerResult.FIRE:窗口计算并输出结果,尽管未清除窗口,但保留了所有元素。 否则的话,就是注册一个以窗口的最大时间戳为时间的定时器。
这里的end是指窗口的结束时间,通常是在WindowAssigner中指定,WindowAssigner有:
以TumblingEventTimeWindows为例: