Flink作业的检查点越来越大。在深入到单个任务之后,键控窗口函数似乎要为大部分的大小负责。我怎样才能减少这个?
如果在windows中绑定了许多状态,则有以下几种可能性:
-
使用增量聚合(通过使用
reduce
或aggregate
)可以显著降低存储需求。否则,每个事件将被复制到分配给每个窗口的事件列表中。 -
如果您在多个时间范围内聚合,例如,每分钟和每10分钟,您可以级联这些窗口,以便10分钟窗口只消耗一分钟窗口的输出,而不是每个事件。
-
如果你使用滑动窗口,每个事件被分配到每个重叠的窗口。例如,如果您的窗口长2分钟,滑动1秒,则每个事件被复制到120个窗口中。增量和/或预聚合将在这里提供帮助(很多!),或者您可能希望使用
KeyedProcessFunction
而不是窗口来优化您的状态占用。 -
如果你有键计数窗口,你可能有键,所需的批大小从来没有(或只是非常缓慢)达到,导致越来越多的部分批处于状态。您可以实现一个自定义的
Trigger
,除了基于计数的触发之外,还包含一个超时,以便最终处理这些部分批处理。 -
如果您在
ProcessWindowFunction
中使用globalState
,则失效密钥的globalState将累积。您可以在globalState的状态描述符上使用状态TTL。注意:这是唯一一个在清除窗口时不会自动释放窗口状态的地方。 -
或者可能只是你的键空间随着时间的推移而增长,除了扩展集群之外,真的没有什么可以做的。