flink窗口状态大小和状态管理

vcirk6k6  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(773)

在阅读了flink的文档并四处搜索之后,我无法完全理解flink是如何处理windows中的状态的。假设我有一个每小时滚动的窗口,其中包含一个聚合函数,该函数将msg累积到一些javapojo或scala case类中。该窗口的大小是与一小时内进入该窗口的事件数相关联,还是仅与pojo/case类相关联,因为我正在将事件累积到该对象中(e、 g如果将10000个msg计算成整数,大小是否接近10000*msg size或int的大小?)另外,如果我使用pojo或case类,flink是否为我处理状态(如果内存耗尽/在检查点保存状态等),或者我必须使用flink的state对象吗?
谢谢你的帮助!

aurhwmvo

aurhwmvo1#

窗口的状态大小取决于应用的函数类型。如果你申请 ReduceFunction 或者 AggregateFunction ,到达的数据立即聚合,窗口仅保存聚合值。如果你申请 ProcessWindowFunction 或者 WindowFunction ,flink收集所有输入记录,并在时间(事件或处理时间取决于窗口类型)超过窗口的结束时间时应用该函数。
您还可以组合这两种类型的函数,即 AggregateFunction 接着是一个 ProcessWindowFunction . 在这种情况下,到达的记录将立即聚合,当窗口关闭时,聚合结果将作为单个值传递给 ProcessWindowFunction . 这很有用,因为您有增量聚合(由于 ReduceFunction / AggregateFunction )还可以访问窗口元数据,如开始和结束时间戳(由于 ProcessWindowFunction ).
如何管理状态取决于所选的状态后端。如果您配置 FsStateBackend 所有本地状态都保存在taskmanager的堆中,jvm进程将被一个 OutOfMemoryError 如果国家发展太大。如果您配置 RocksDBStateBackend 状态已溢出到磁盘。这会为每个状态访问带来反序列化成本,但会为状态提供更多的存储空间。

相关问题