Flink window所有聚合比window进程?

Flink windowAll aggregate than window process?

我们正在收集一些数据 1 分钟,然后将其刷新到一个文件中。数据本身就像一张地图,其中键是一个对象,值也是一个对象。

因为我们需要一起刷新数据,所以我们没有做任何 keyBy,因此使用 windowAll.

我们面临的问题是,如果我们将 window 函数与 ProcessAllWindowFunction 一起使用,然后在进程调用中进行聚合,而当我们将聚合与 window 函数一起使用时,我们将获得更好的吞吐量。当我们使用聚合时,我们还看到状态检查点超时。

我尝试查看代码库,我能想到的唯一假设可能是检查点 ListState 进程将使用的 ListState 与聚合将使用的 AggregateState 相比更容易。

假设是否正确?我们做错了什么吗?如果没有,有没有办法提高聚合性能?

根据你所说的,我要得出一些结论。

我假设您正在使用 RocksDB 状态后端,并将每个传入事件聚合到某种集合中。在这种情况下,RocksDB 状态后端必须反序列化该集合,将新事件添加到其中,然后重新序列化它——对于每个事件。这个很贵。

当您使用 ProcessAllWindowFunction 时,每个传入事件都附加到一个 ListState 对象,该对象的实现非常高效——新事件的序列化字节只是附加(列表不必反序列化和重新序列化)。

检查点超时,因为吞吐量太低了。

切换到 FsStateBackend 会有所帮助。或者使用 ProcessAllWindowFunction。或者使用 KeyedProcessFunction 实现您自己的窗口,然后使用 ListStateMapState 进行聚合。