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 状态的其他部分一样,这里的状态要么从状态后端检索,要么根据第一原理重新计算上游数据。
我想使用早期触发逻辑进行 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 状态的其他部分一样,这里的状态要么从状态后端检索,要么根据第一原理重新计算上游数据。