带状态的 Flink 窗口聚合

问题描述

我想使用早期触发逻辑进行窗口聚合(您可以认为聚合是由窗口关闭或特定事件触发的),我阅读了文档: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 状态的其他部分一样,这里的状态要么从状态后端检索,要么根据上游数据的第一原则重新计算.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...