“ 无界数据于有界数据是一个比较于模糊的概念,无界与有界之间是可以进行转换的。无界数据流在进行某些计算的时候例如每分钟、每小时、每天等操作时都可以看做是有界数据集。Apache Flink使用Windows方式实现了对于无界数据集到有界数据集的计算。”
Apache Flink Window 概述
Windows是流式计算中最常用的计算方式之一,通过固定的时长(分钟,小时,天)与固定的长度(X条)的方式把无界的数据集划分到一个固定的空间中进行计算,从而得到该范围内的结果。例如常见的五分钟内登陆用户数,1000条数据内的错误比例等。
Apache Flink在DataStreaming API中内置实现了一些窗口的算子。每个窗口中都包含Window Assigners(窗口分配器)、Triggers(窗口触发器)、Evitor(数据剔除器)、Lateness(时延)等。
完整的来看,Windows Assigners会在属于窗口的第一个元素到来的时候就会创建窗口,当时间、数量或自定义的Trigger触发时候会进行窗口的聚合计算。允许数据的Lateness。
每个窗口都会有一个Trigger与ProcessWindowFunction、ReduceFunction、AggreateFunction或FoldFunction用于实现窗口内容的计算。
Apache Flink 窗口的类别 Window Assigners
Window Assigners指定了数据应该分配与那个窗口。例如基于时间的窗口提供基于时间进行窗口的创建,同样窗口也就是包含了时间的属性:开始时间戳与结束时间戳。还有基于数量的窗口,例如前面提到的1000条数据。那么窗口就会把每1000条数据作为一个窗口。
滚动窗口
滚动窗口根据名字来看就是滚动进行计算的,而滚动的呢(当然不是人,请各位描述的时候加上相关信息,有次我就闹过笑话)就是时间或者大小。按照固定的时间或者大小进行拆分。这种计算比较简单,适合于比较固定时间的计算,例如计算01点的用户点击次数。12点的用户点击次数。这种计算前后窗口之间不会产生交集。没有产生前后的关系。DataStream API中包含了Event Time与Process Time时间类型的窗口。详细的时间介绍可以看我前一篇文章<<Apache Flink中的各个窗口时间的概念区分>>,同时对应的也有Event与Process相关的Trigger进行计算的触发。
滑动窗口
滑动窗口也是Apache Flink提供的一种简单的窗口计算方式,滑动窗口与滚动窗口特点差不多同样是基于时间大小进行的计算。滑动窗口在滚动窗口的基础上增加了窗口的滑动时间,允许窗口的数据发生重叠。简单来看,例如实现五分钟内的异常数量统计,统计异常五分钟内异常个数大于50就产生告警行为。那么看下面的案例。
根据当前的情况,如果使用滚动的窗口来进行计算,那么这个时间的数据不会产生告警,但是其实实际的情况是当在第五分钟跟第六分钟的数据加起来时已经是50了,2min~6min的时候需要进行告警。也就像是在传统的计算中,我们计算五分钟内发生告警,基于当前时间往前五分钟,但是计算是每分钟一次。
滑动窗口实现的就是这个功能,我们能够设置Slide Time使其进行滑动,窗口之间的数据重叠通过Window Time和Slide Size决定的。Slide Size就是我们计算的时间间隔,Window Time就是我们要计算的数据的时间间隔。
Window Time大于Slide Size也就是数据会重叠到多个窗口,比如1到5分钟的窗口会包含第2分钟的数据。2到六分钟的窗口也会包含第2分钟的数据。Window Time小于Slide Size就会出现数据不存在与任何窗口,也就是数据没有产生计算。例如 Window Size依然为5分钟,但是Slide Size为一个小时,那么窗口再产生计算的时候就只会计算计算时间前5分钟的数据,其他的数据没有产生计算。
滑动窗口帮助我们实现的业务场景也就是刚才上面讲到的案例。在实际的业务中会有大量的业务场景选用。
会话窗口
Session Window可能对于Session都比较了解,Session Window就是一种会话形态的窗口,主要是将在某个时间段活跃较高的相关数据聚合在一起。与滚动窗口和滑动窗口不同的是,Session Window 不需要Window Size和Slide Time,Session Window与MySql Session或其他Session的机制很像,窗口的触发条件是Session Gap,指在某个时间不没有活跃的数据时就会进行触发。也就是说,如果一直都有数据进来窗口,那么该窗口就不会产生触发计算。
例如统计用户的在线时长信息,用户会定时上报相关数据,从用户首次上报开始创建窗口,用户定期产生打点数据会进入该窗口,如果5分钟没有收到用户的数据则判断该用户退出,即触发该用户的在线时长计算。
滑动窗口与前两个窗口一样也可以设置基于Event Time,Process Time的Session Window。会话窗口其实与前两个不一样,其实本身是没有起止时间的。它是针对于进入的数据创建的窗口。最后基于Session Gap的逻辑计算的结果。
全局窗口
Global Window与其他的窗口均不同,Global Window是把所有相同的key都会生成一个相关的窗口,所以窗口没有起止时间,需要自己实现Trigger的触发计算,如果不实现Trigger则窗口永远不会进行计算。同时还需要指定相应的数据清理机制,如果不进行数据清理数据一直会停留在内存中。所以使用Global Window要较为慎重。