Flink笔记--窗口

Flink学习笔记

窗口Windows

Windows是处理无限数据流的核心。Windows将数据流切割成为有限大小的”数据块”,并在”数据块”上执行相应的计算。

窗口的生命周期

属于窗口的第一个元素到达时窗口会被创建,而到达加上指定延迟的最后期限时窗口被移除。 每个窗口会有一个 Tigger 触发器和一个处理数据的函数。触发器决定着什么时候可以调用处理数据的函数。 除此以外还有一个移除器,决定将哪些数据移除。

分组与无分组窗口

使用keyBy(…) 会将流逻辑分成多个流。多个流之间是可以并行计算的。同一个分组的数据会被发送到同一个流中。 而无分组的流,那么所有的逻辑窗口都会被认为是一个任务,无法并行计算。

Window Assigners

一个WindowAssigner负责将接收到的数据按照规则赋给一个或多个窗口。Flink 已经提供了几种常用的WindowAssigner,分别是_tumbling windows_, sliding windows, session windowsglobal 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:

  1. Flink 会为每个窗口创建一个元素的副本。鉴于此,滚动窗口将会是每个窗口有独立的元素。而在滑动窗口中,可能每个元素会被创建多次。因此如果一个滑动窗口范围长度是1天,而滑动长度是1秒,那么这绝对不是一个好的主意。
  2. ReduceFunction, AggregateFunction, 和 FoldFunction可以显著地减小空间需求。
  3. 使用移除器 Evictor 来避免使用预聚合
最近的文章

Flink笔记--容错数据流

Flink学习笔记-容错数据流有状态的函数和操作需要存储关于计算的数据,这使得状态成为复杂计算的关键。在 Flink 中的每一种函数和操作都可以成为有状态的。为了达到很好的容错,Flink 的容错机制持续的记录分布式的数据流的快照。这些快照是非常轻量化的,因此高频的记录快照并不会影响性能。当程序由于机器,网络甚至是软件异常而失败的时候,Flink 会停止数据流。系统重启操作同时将他们恢复到最近的快照点。输入流也会被设置到记录快照点那个时间点。系统可以确保任何一条新于快照点的记录都不会记录在...…

继续阅读
更早的文章

多版本并发控制MVCC

多版本控制MVCC调度冲突串行化在中 ACID 的 C ,指的是数据库中记录或映射的数据与真实世界中要一致,通俗一点说就是准确。事务的原子性,隔离性和持久性最终的目的都是为了数据的准确。串行化是保证数据库一致性的最高级别。但是为了获得更好的数据库性能,多个事务需要同时执行。这时数据库的调度显得尤为重要,也就是数据库的并发控制。串行化是指同一个事务的操作被同时调度,同一时间内只执行同一事务内的操作。 如果两个事务间存在对同一数据项的写操作(write),那么认为这俩事务是冲突的,那么不同的...…

继续阅读