Flink Window触发机制

1. 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()
2.窗口函数有哪些

定义完窗口分配器后,需要指定在每个窗口上执行的计算,这就是窗口函数的职责。
在了解有哪些窗口函数之前,有必要了解Window的聚合分类:
全量聚合:简单点说是等属于窗口的数据到齐之后,才开始进行聚合计算;即全量聚合在未触发之前,会保存之前的状态,在最后窗口触发时,才会进行计算。(所以全量聚合的压力会很大。)
常见的窗口函数:
apply(WindowFunction) --- 不过1.3之后被弃用
process(processWindowFunction)

增量聚合:窗口每进入一条数据,就进行一次计算。
reduce(reduceFunction);
fold;
aggregate(aggregateFunction);
sum(key);min(key);max(key)
sumBy(key);minBy(key);maxBy(key)

我们需要根据业务场景需要,决定使用是全量聚合还是增量聚合,并进一步选择使用哪一种聚合函数。

3.Window何时会被触发

Window何时被触发计算,是由触发器Trigger的onElement方法所决定。


image.png

该方法的参数:
(1)element:到达的元素
(2)timestamp:元素达到的时间戳
(3)window:元素将被分配的窗口
(4)context:上下文

以时间类型设置为EventTime之后,触发器就是EventTimeTrigger,对应的onElement方法:


image.png

方法很简单:如果当前的watermark已经大于或等于窗口的最大时间戳(即窗口的endTime),那么就会触发窗口计算,并输出结果。
TriggerResult.FIRE:窗口计算并输出结果,尽管未清除窗口,但保留了所有元素。
否则的话,就是注册一个以窗口的最大时间戳为时间的定时器。

window.maxTimestamp()
image.png

这里的end是指窗口的结束时间,通常是在WindowAssigner中指定,WindowAssigner有:


image.png

以TumblingEventTimeWindows为例:


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容