6.1 window的概念

- 一般真实的流都是无界的,怎样处理无界的数据?
- 可以把无限的数据流进行切分,得到有限的数据集进行处理——也就是得到有界流。
- 窗口(window)就是将无限流切割为有限流的一种方式,它会将数据流分发到有限大小的桶(bucket)中进行分析。
6.2 window的类型
- 时间窗口(Time Window)
- 滚动时间窗口(Tumbling Window):将数据流依据固定的窗口长度(时间)进行切分,窗口长度固定,窗口没有重叠。窗口边界一般是“左闭右开”。
- 滑动时间窗口(Sliding Window):滑动窗口由固定的窗口长度和滑动间隔组成。窗口长度固定,可以有重叠。(滚动窗口可视为滑动间隔等于窗口长度的滑动窗口)
- 会话窗口(Session Window):由一系列事件组合成一个指定时间长度的timeout间隙组成,也就是一段时间没有接收到新数据时,就会生成一个窗口(但不会立即开启下一个窗口)。窗口长度不固定。
- 计数窗口(Count Window)
- 滚动计数窗口
- 滑动计数窗口
6.3 window API
6.3.1 窗口分配器(window assigner)
window()方法
- 我们可以用window()来定义一个窗口,然后基于这个window去做一些聚合或者其他处理操作。注意window()方法必须在keyBy之后才能用。
- Flink提供了更加简单的timeWindow和countWindow方法,用于定义时间窗口和计数窗口。
调用window()类方法之前,通常需要先keyBy分区,这是为了并行处理。如果不想keyBy,可调用windowAll()方法,这也意味着需要对整个数据流开窗,则数据需要汇聚到一个计算节点上,无法并行。
window()方法接收的输入参数是一个WindowAssigner。WindowAssigner负责将每条输入数据分发到正确的window中。
Flink提供了通用的WindowAssigner
window function定义了要对窗口中收集的数据做的计算操作。可以分为两类:
- 增量聚合函数(increment aggregation functions)
- 每条数据到来就进行计算,保持一个简单的状态。但聚合结果要在窗口结束时才正式产生。
- ReduceFunction,AggregateFunction,sum,min
- 全窗口函数(full window function)
- 先把窗口所有数据收集起来,等到计算的时候会遍历所有数据。
- ProcessWindowFunction,WindowFunction
增量聚合相当于过滤。和不开窗的流相比,计算结果流是一样的,只不过结果流中依据窗口筛选,一个窗口只放出一个结果。
- 增量聚合函数(increment aggregation functions)
ReduceFunction和AggregateFunction的区别: reduce规约后的结果和数据源是一个类型; aggregate聚合后源数据、中间数据、结果数据类型都可以不同。
ProcessWindowFunction和WindowFunction的区别: 两者功能参数、功能几乎一致,都是对一个窗口内的数据集合进行处理,产生结果。但区别是,ProcessWindowFunction可以拿到Context上下文参数,而WindowFunction只能拿到window当前窗口参数。即ProcessWindowFunction可以获得更多上下文信息。
6.4 其他可选API
- trigger()——触发器
- 定义window什么时候关闭,触发计算并输出结果。
- 应用场景:处理迟到数据。
- evictor()——移除器
- 定义移除某些数据的逻辑。
- 应用场景:计算前移除某些数据。
- allowedLateness()——设置允许数据迟到的时间,默认为0。
- sideOutputLateData()——为窗口关闭后才到达的数据打标,然后发送给专门的旁路流。旁路流可通过在主流上调用getSideOutput()方法获取。

