问题描述
我想使用早期触发逻辑进行窗口聚合(您可以认为聚合是由窗口关闭或特定事件触发的),我阅读了文档:https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows/#incremental-window-aggregation-with-aggregatefunction
文档中提到了 Note that using ProcessWindowFunction for simple aggregates such as count is quite inefficient.
,因此建议与增量窗口聚合配对。
我的问题是doc中的AverageAggregate,状态没有保存在任何地方,所以如果应用程序崩溃,averageAggregate会丢失所有中间值,对吗?
那么如果是这样的话,有没有办法做一个窗口聚合,仍然支持增量聚合,并且有一个状态后端来从崩溃中恢复?
解决方法
AggregateFunction
确实只是描述了将输入事件组合成某个结果的机制,该特定类不存储任何数据。
状态是由 Flink 在幕后为我们持久化的,当我们写这样的东西时:
input
.keyBy(<key selector>)
.window(<window assigner>)
.aggregate(new AverageAggregate(),new MyProcessWindowFunction());
.keyBy(<key selector>).window(<window assigner>)
指示 Flink 为我们保存每个键和时间段的状态,并在相关时在 AverageAggregate()
和 MyProcessWindowFunction()
中调用我们的代码。>
在崩溃或重启的情况下,不会丢失任何数据(假设状态后端配置正确):与 Flink 状态的其他部分一样,这里的状态要么从状态后端检索,要么根据上游数据的第一原则重新计算.