在工作中需要计算指定时间段内的某产品新增用户,可以实现的技术方案有多种,比如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内的元素,进行清理;目前主要有三类,继承关系如下:

网友评论