Flink window 聚合与状态

Flink window aggregation with state

我想使用早期触发逻辑进行 window 聚合(您可以认为聚合是由 window 关闭或特定事件触发),我阅读文档:https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows.html#incremental-window-aggregation-with-aggregatefunction

文档提到 Note that using ProcessWindowFunction for simple aggregates such as count is quite inefficient. 因此建议与增量 window 聚合配对。

我的问题是文档中的 AverageAggregate,状态没有保存在任何地方,所以如果应用程序崩溃,averageAggregate 将丢失所有中间值,对吗?

那么如果是这样的话,有没有办法进行 window 聚合,仍然支持增量聚合,并且有一个状态后端可以从崩溃中恢复?

AggregateFunction确实只是描述了将输入事件组合成一些结果的机制,具体class不存储任何数据。

Flink 在幕后为我们保留了状态,当我们这样写时:

input
  .keyBy(<key selector>)
  .window(<window assigner>)
  .aggregate(new AverageAggregate(), new MyProcessWindowFunction());

.keyBy(<key selector>).window(<window assigner>) 指示 Flink 为我们为每个键和时间桶保存一个状态,并在相关时调用我们在 AverageAggregate()MyProcessWindowFunction() 中的代码。

在崩溃或重启的情况下,不会丢失数据(假设状态后端配置正确):与 Flink 状态的其他部分一样,这里的状态要么从状态后端检索,要么根据第一原理重新计算上游数据。