Flink内window机制的实现和应用

在工作中需要计算指定时间段内的某产品新增用户,可以实现的技术方案有多种,比如Spark StructedStreaming和 Flink Streaming。下面以Flink 2.11代码为例,阐述一下Flink内的window机制。

window分类

在Flink Streaming里,窗口可以分为countWindow,timeWindow和window;而这三种窗口,又可以细分,例如tumbligWindow和slidingWindow;tumblingWindow任意两个窗口之间,没有数据的交集;slidingWindow两个或者多个窗口之间,会有数据的交集,如下所示:


TimeWindow的实现

在Flink内,针对元素主要有三种时间,分别processing Time, Event Time, Ingest Time;在keyedStream类内查看代码可以看到,在timeWindow函数内,Event Time 和Ingest Time都是通过EventTimeWindowAssginer来创建WindowStream,其他情况下则是通过ProcessingTimeWindow来创建window Stream。


在Sliding Time window内,assinger在根据元素分配窗口时,首先会创建size/slide个window,每个窗口的大小为size,并且在每个窗口结束的时候,注册一个定时器;当定时器触发时,会调用该窗口对应的Trigger类中的onProcessingTime方法,然后调用对应的window function.代码如下所示:

CountWindow的实现同Timewindow类似,分为TumblingCountWindow和SlidingCountWindow.

在Flink streaming内,windows机制主要有三部分组成:windows Assigner, trigger, evictor;

当每一条element到来时,由windows Assigner来决定这条element,分配到哪个window窗口;

当到达一定的触发条件以后,trigger会触发,对windows内的元素进行处理;在trigger调用以后,会调用evictor,根据用户调用的窗口类型和参数,来决定是在windows function之前或之后,对windows内的元素进行处理;整体流程关系如下所示:


Window Assigner用来决定element分配到哪个window内


window trigger用来判断一个窗口什么时候去计算或者清除


Evictor主要是在Trigger触发以后,在调用windowsFunction之前或之后,触发evictor函数,对windows内的元素,进行清理;目前主要有三类,继承关系如下:


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

相关阅读更多精彩内容

友情链接更多精彩内容