39、Flink 的窗口剔除器(Evictors)详解

Evictors

Flink 的窗口模型允许在 WindowAssignerTrigger 之外指定可选的 Evictor,通过 evictor(...) 方法传入 Evictor

Evictor 可以在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素, Evictor 接口提供了两个方法实现此功能:

/**
 * 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() 包含在窗口函数调用之后的逻辑,在调用窗口函数之前被移除的元素不会被窗口函数计算。

Flink 内置有三个 evictor

  • CountEvictor: 仅记录用户指定数量的元素,一旦窗口中的元素超过这个数量,多余的元素会从窗口缓存的开头移除。
  • DeltaEvictor: 接收 DeltaFunctionthreshold 参数,计算最后一个元素与窗口缓存中所有元素的差值,并移除差值大于或等于 threshold 的元素。
  • TimeEvictor: 接收 interval 参数,以毫秒表示,它会找到窗口中元素的最大 timestamp max_ts 并移除比 max_ts - interval 小的所有元素。

默认情况下,所有内置的 evictor 逻辑都在调用窗口函数前执行。

指定一个 evictor 可以避免预聚合,因为窗口中的所有元素在计算前都必须经过 evictor。

Note: Evictor 在 Python DataStream API 中还不支持.

Flink 不对窗口中元素的顺序做任何保证,即使 evictor 从窗口缓存的开头移除一个元素,这个元素也不一定是最先或者最后到达窗口的。

相关推荐

  1. 39Flink 窗口剔除Evictors详解

    2024-05-25 23:52:23       31 阅读
  2. 37Flink 窗口函数(Window Functions)详解

    2024-05-25 23:52:23       24 阅读
  3. 36Flink WindowAssigner之滑动窗口示例

    2024-05-25 23:52:23       26 阅读
  4. 37Flink WindowAssigner之会话窗口示例

    2024-05-25 23:52:23       28 阅读
  5. 30Flink 故障恢复详解

    2024-05-25 23:52:23       22 阅读
  6. 31Flink DataStream API 数据流算子详解

    2024-05-25 23:52:23       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 23:52:23       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 23:52:23       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 23:52:23       82 阅读
  4. Python语言-面向对象

    2024-05-25 23:52:23       91 阅读

热门阅读

  1. springboot常用的注解

    2024-05-25 23:52:23       32 阅读
  2. 怎样理解 Vue 的单项数据流

    2024-05-25 23:52:23       25 阅读
  3. CS144 Lab Checkpoint 5: down the stack (the network interface)

    2024-05-25 23:52:23       29 阅读
  4. vue富文本层级高

    2024-05-25 23:52:23       34 阅读
  5. 信息系统管理工程师问答题

    2024-05-25 23:52:23       30 阅读
  6. 量子计算在科技浪潮中的引领作用

    2024-05-25 23:52:23       32 阅读