Flink的窗口模型允许在指定WindowAssigner和Trigger之外指定一个可选的驱逐器。这可以通过使用evictor(…)方法来完成(见本文开头)。驱逐器能够在触发器触发后以及在应用窗口函数之前和/或之后从窗口中删除元素。
代码语言:javascript复制/**
* 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);
evictBefore()包含要在窗口函数之前应用的收回逻辑,而evictAfter()包含要在窗口函数之后应用的收回逻辑。在window函数的应用程序之前被逐出的元素将不会被window函数处理。
Flink附带了三个预实现的驱逐器。这些都是:
CountEvictor
: 在窗口中保持用户指定的元素数量,并丢弃窗口缓冲区开头的剩余元素。DeltaEvictor
: 接受一个DeltaFunction和一个阈值,计算窗口缓冲区中最后一个元素和其余每个元素之间的增量,并删除增量大于或等于阈值的元素。TimeEvictor
: 接受以毫秒为单位的interval作为参数,对于给定的窗口,它会在其元素中查找最大时间戳max_ts,并删除时间戳小于max_ts – interval的所有元素。.
默认情况下,所有预实现的 evictors 在窗口函数之前应用它们的逻辑。
指定回收器可以防止任何预聚合,因为在应用计算之前,窗口的所有元素都必须传递给回收器。这意味着带有驱逐器的窗口将创建更多的状态。
Flink不保证窗口中元素的顺序。这意味着,尽管驱逐器可以从窗口的开头删除元素,但这些元素并不一定是最先或最后到达的元素。