Flink学习笔记
窗口Windows
Windows是处理无限数据流的核心。Windows将数据流切割成为有限大小的”数据块”,并在”数据块”上执行相应的计算。
窗口的生命周期
属于窗口的第一个元素到达时窗口会被创建,而到达加上指定延迟的最后期限时窗口被移除。 每个窗口会有一个 Tigger 触发器和一个处理数据的函数。触发器决定着什么时候可以调用处理数据的函数。 除此以外还有一个移除器,决定将哪些数据移除。
分组与无分组窗口
使用keyBy(…) 会将流逻辑分成多个流。多个流之间是可以并行计算的。同一个分组的数据会被发送到同一个流中。
而无分组的流,那么所有的逻辑窗口都会被认为是一个任务,无法并行计算。
Window Assigners
一个WindowAssigner负责将接收到的数据按照规则赋给一个或多个窗口。Flink 已经提供了几种常用的WindowAssigner,分别是_tumbling windows_, sliding windows, session windows 和 global windows
窗口函数window function
我们需要指定希望应用在窗口上的计算,这就需要给窗口增加一个window function。一旦窗口准备好被处理,那么window function就会被调用,应用于窗口中的数据。 窗口函数window function 可以是下来函数中的任意一种
- ReduceFunction
- AggregateFunction
- FoldFunction
- ProcessWindowFunction
触发器Triggers
触发器决定什么时候调用窗口函数。每个WindowAssigner 都会带有一个默认的触发器。当然如果默认不满足需求,可以通过triger(...)自定义触发器。
触发器接口有以下5个方法来响应不同的事件
- onElement() 每当有元素加到窗口后会被调用
- onEventTime() 当一个注册的事件时序计算器触发时被调用
- onProcessingTime() 当一个注册的处理时序计算器触发时被调用
- onMerge() 这个方法是与状态触发器有关。当多个窗口合并的时候,相应的触发器也做合并时候被调用。
- clear() 窗口被移除时被调用
移除器Evictors
移除器能够将窗口中的元素移除。移除器会在触发器触发后,窗口函数应用前被调用。也可用在触发器触发后,窗口函数应用后被调用。因此一个移除器有下面两个接口
/**
* Optionally evicts elements. Called before windowing function.
*
* @param elements The elements currently in the pane.
* @param size The current number of elements in the pane.
* @param window The {@link Window}
* @param evictorContext The context for the Evictor
*/
void evictBefore(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);
/**
* Optionally evicts elements. Called after windowing function.
*
* @param elements The elements currently in the pane.
* @param size The current number of elements in the pane.
* @param window The {@link Window}
* @param evictorContext The context for the Evictor
*/
void evictAfter(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);
应用窗口函数前被移除的函数将不会被窗口函数计算的。
数据量的思考
窗口可以被放到很长的一段时间中。因此可能有很大的数据占用。下面有几点关于窗口空间的注意事项 Windows can be defined over long periods of time (such as days, weeks, or months) and therefore accumulate very large state. There are a couple of rules to keep in mind when estimating the storage requirements of your windowing computation:
- Flink 会为每个窗口创建一个元素的副本。鉴于此,滚动窗口将会是每个窗口有独立的元素。而在滑动窗口中,可能每个元素会被创建多次。因此如果一个滑动窗口范围长度是1天,而滑动长度是1秒,那么这绝对不是一个好的主意。
- ReduceFunction, AggregateFunction, 和 FoldFunction可以显著地减小空间需求。
- 使用移除器 Evictor 来避免使用预聚合