1.为什么需要Window
在讲这个问题之前,我们先补充批处理和流处理的知识。
批处理:就是对历史数据/有界数据进行处理,如前一天/前7天/前2周/前1/3/6月,前1年…,批处理的任务特点是:跑完一次,就停止,就结束,等待下一次周期调度!而且批处理对于任务完成时间要求不高!一般几个小时内跑完都能够接受!
流处理:就是实时的源源不断到来的流式数据/无界数据进行处理!如:实时统计最近5s/1min/1h的数据,特点是程序启动之后会一直运行,等待数据到来!除非遇到异常或手动停止!
那么为什么需要Window呢,因为我们需要在实时数据中统计有边界的数据。之前说过Flink是专门做流式数据/无界数据处理的,可以一直处理源源不断到来的实时数据!
如:实时的统计双十一交易额!
但是在实际开发中,对于流式数据处理也有这样的需求,
如:每隔5s中统计一次最近1min的数据!
如:每隔1min统计一次最近1小时的热搜排行榜!
而上面的这种需求其实也是属于实时领域的!
只不过看上去像是在每隔一段时间处理一次之前一段时间的离线数据而已!
但是整个的实时处理程序并没有停止! 所以该需求还是实时的!
那么该如何实现这样的看上去像是离线的实时需求呢?
所以这里要学习新的技术来解决!----window技术,window窗口的特点就是有边界。
2.window如何解决上面的需求
window窗口需要设置窗口大小size和窗口滑动间隔slide,通过window窗口实现上面的需求。
情况1:
窗口的大小= 5s
窗口的滑动间隔 = 5s
那么就实现了每隔5s统计最近5s的实时数据!
情况2:
窗口的大小= 1min
窗口的滑动间隔 = 5s
那么就实现了每隔5s统计最近1min的实时数据!
3.window窗口的五种类型
基于时间的滚动窗口tumbling-time-window:根据时间划分窗口,窗口大小size = 滑动间隔slide,用的较多
基于时间的滑动窗口sliding-time-window:根据时间划分窗口,窗口大小size > 窗口滑动间隔,用的较多
基于数量的滚动窗口tumbling-count-window:根据数量划分窗口,窗口大小size = 窗口滑动间隔slide,用的较少
基于数量的滑动窗口sliding-count-window:根据数量划分窗口,窗口大小size > 窗口滑动间隔slide,用的较少
Flink还支持一个特殊的窗口:Session绘画窗口,需要设置一个会话超时时间,如设置会话超时时间为30s,则表示30s内没有数据到来,则触发上个窗口的计算。
备注:当size < slide时,会发生数据丢失,,如每隔15s统计最近10s的数据,那么中间5s的数据会丢失。,所以开发中不会使用。