flink windowall聚合比window进程?

pod7payv  于 2021-07-15  发布在  Flink
关注(0)|答案(1)|浏览(434)

我们将一些数据聚合1分钟,然后刷新到一个文件中。数据本身就像一个Map,其中键是一个对象,值也是一个对象。
因为我们需要一起刷新数据,所以我们没有执行任何keyby操作,因此使用windowall。
我们面临的问题是,如果我们将window函数与processallwindowfunction一起使用,然后在进程调用中聚合,那么吞吐量会比使用aggregate with window函数时更好。当我们使用aggregate时,状态检查点中也会出现超时。
我试着浏览代码库,我能想到的唯一假设是,检查点liststate与aggregate使用的aggregatestate可能更容易。
这个假设正确吗?我们做错什么了吗?如果没有,是否有办法提高聚合性能?

xmd2e60i

xmd2e60i1#

根据你所说的,我将得出一些结论。
我假设您正在使用rocksdb state后端,并将每个传入事件聚合到某种集合中。在这种情况下,rocksdb state后端必须对该集合进行反序列化,向其中添加新事件,然后对每个事件重新序列化。这个很贵。
当你使用 ProcessAllWindowFunction ,每个传入事件将附加到 ListState 对象,它有一个非常有效的实现——新事件的序列化字节被简单地追加(列表不必反序列化和重新序列化)。
检查点超时是因为吞吐量太低。
切换到 FsStateBackend 会有帮助的。或者使用 ProcessAllWindowFunction . 或者用一个 KeyedProcessFunction ,然后使用 ListState 或者 MapState 对于聚合。

相关问题