首页 > 解决方案 > 为什么我的 Flink 窗口使用这么多状态?

问题描述

我的 Flink 工作的检查点越来越大。在深入研究单个任务之后,键控窗口功能似乎负责大部分大小。我怎样才能减少这种情况?

标签: apache-flinkflink-streaming

解决方案


如果您在 Windows 中绑定了很多状态,则有几种可能性:

  • 使用增量聚合(通过使用reduceor aggregate)可以显着降低您的存储需求。否则,每个事件都会被复制到分配给每个窗口的事件列表中。

  • 如果您在多个时间范围内进行聚合,例如每分钟和每 10 分钟,您可以级联这些窗口,以便 10 分钟窗口仅消耗一分钟窗口的输出,而不是每个事件。

  • 如果您使用滑动窗口,则每个事件都被分配给每个重叠窗口。例如,如果您的窗口长 2 分钟并滑动 1 秒,则每个事件将被复制到 120 个窗口中。增量和/或预聚合在这里会有所帮助(很多!),或者您可能希望使用 aKeyedProcessFunction而不是窗口来优化您的状态足迹。

  • 如果您有键控计数窗口,您可能拥有从未(或仅非常缓慢地)达到所需批量大小的键,导致越来越多的部分批次处于状态。除了基于计数的触发之外,您还可以实现一个Trigger包含超时的自定义,以便最终处理这些部分批次。

  • 如果您globalState在 a中使用ProcessWindowFunction,则过期键的 globalState 将累积。您可以在 globalState 的状态描述符上使用状态 TTL。注意:这是唯一一个在清除窗口时不会自动释放窗口状态的地方。

  • 或者可能只是您的密钥空间随着时间的推移而增长,除了扩展集群之外,真的没有什么可以做的。


推荐阅读