一、窗口(window)
(1)一般真实的流都是无界的,怎样处理无界的数据?
(2)可以把无限的数据流进行切分,得到有限的数据集进行处理——也就是得到有界流;
(3)窗口(window)就是将无限流切割为有限流的一种方式,它会将流数据分发到有限大小的桶(bucket)中进行分析;
二、window类型
(1)时间窗口(Time Window):滚动时间窗口,滑动时间窗口,会话窗口;
(2)计数窗口(Count Window):滚动计数窗口,滑动计数窗口;
1、滚动窗口(Tumbling Windows)
1)将数据依据固定的窗口长度对数据进行切分;
2)时间对齐,窗口长度固定,没有重叠;
2、滑动窗口(Sliding Windows)
1)滑动窗口是固定窗口更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成;
2)窗口长度固定,可以重叠;
3、会话窗口(Session Windows)
1)由一系列事件组合一个指定时间长度的timeout间隙组成,也就是一段时间没有接收到新数据就会生成新的窗口;
2)特点:时间无对齐
三、window API
1、窗口分配器——window()方法
1)我们可以用.window()来定义一个窗口,然后基于这个window去做一些聚合或者其它处理操作。注意window()方法必须在keyBy之后才能用。
2)Flink提供了更加简单的.timeWindow和.countWindow方法,用于定义时间窗口和计数窗口。
2、窗口分配器(window assigner)
1) window()方法接收的输入参数是一个WindowAssigner;
2)WindowAssigner负责将每条输入的数据分发到正确的window中;
3)Flink提供了通用的WindowAssigner:滚动窗口(tumbling window)、滑动窗口(sliding window)、会话窗口(session window)、全局窗口(global window);
3、创建不同类型的窗口
1)滚动时间窗口(tumbling time window):
.timeWindow(Time.seconds(15))
2)滑动时间窗口(sliding time window)
.timeWindow(Time.seconds(15),Time.seconds(5))
3)会话窗口(session window)
.window(EventTimeSessionWindows.withGap(Time.minutes(10)))
4)滚动计数窗口(tumbling count window)
.countWindow(5)
5)滑动计数窗口(sliding count window)
.countWindow(10,2)
4、窗口函数(window function)
(1)window function定义了要对窗口中收集的数据做的计算操作;
(2)可以分为两类:
1)增量聚合函数(incremental aggregation functions)
*****每条数据到来就进行计算,保持一个简单的状态;
*****ReduceFunction,AggregateFunction
2)全窗口函数(full window functions)
*****先把窗口所有数据收集起来,等到计算的时候会遍历所有数据;
*****ProcessWindowFunction
5、其它可选API
(1).trigger()——触发器
*****定义window什么时候关闭,触发计算并输出结果;
(2).evictor()——移除器
*****定义移除某些数据的逻辑
(3).allowedLateness()——允许处理迟到的数据
(4).slideOutputLateData()——将迟到的数据放入侧输出流
(5).getSideOutput()——获取侧输出流
window API 总览