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

Apache flink Flink窗口状态大小和状态管理,apache-flink,stream-processing,Apache Flink,Stream Processing,在阅读了flink的文档并四处搜索之后,我无法完全理解flink是如何在其windows中处理状态的。 假设我有一个每小时滚动的窗口,其中包含一个聚合函数,可以将MSG累积到某个JavaPOJO或scala案例类中。 该窗口的大小将与一小时内进入该窗口的事件数绑定,还是仅与pojo/case类绑定,因为我将事件累积到该对象中。(例如,如果将10000个msg计算为一个整数,那么大小会接近10000*msg大小还是整数大小?) 另外,如果我使用POJO或case类,flink是否为我处理状态(如果

在阅读了flink的文档并四处搜索之后,我无法完全理解flink是如何在其windows中处理状态的。 假设我有一个每小时滚动的窗口,其中包含一个聚合函数,可以将MSG累积到某个JavaPOJO或scala案例类中。 该窗口的大小将与一小时内进入该窗口的事件数绑定,还是仅与pojo/case类绑定,因为我将事件累积到该对象中。(例如,如果将10000个msg计算为一个整数,那么大小会接近10000*msg大小还是整数大小?) 另外,如果我使用POJO或case类,flink是否为我处理状态(如果内存耗尽,则溢出到磁盘/在检查点保存状态等),或者我必须为此使用flink的状态对象


谢谢你的帮助

窗口的状态大小取决于应用的函数类型。如果应用
ReduceFunction
AggregateFunction
,则到达的数据将立即聚合,窗口仅保存聚合值。如果应用
ProcessWindowFunction
WindowFunction
,Flink将收集所有输入记录,并在时间(事件或处理时间取决于窗口类型)超过窗口结束时间时应用该功能

您还可以组合这两种类型的函数,即先有一个
AggregateFunction
,然后是一个
ProcessWindowFunction
。在这种情况下,到达的记录将立即聚合,当窗口关闭时,聚合结果将作为单个值传递给
ProcessWindowFunction
。这很有用,因为您可以进行增量聚合(由于
ReduceFunction
/
AggregateFunction
),还可以访问窗口元数据,如开始和结束时间戳(由于
ProcessWindowFunction


状态的管理方式取决于所选的状态后端。如果配置
fsstatebend
所有本地状态都保留在TaskManager的堆上,并且如果状态变得太大,JVM进程将被
OutOfMemoryError
终止。如果配置
rocksdbstatebend
状态将溢出到磁盘。这会为每个状态访问带来反序列化成本,但会为状态提供更多存储。

非常感谢您的帮助!所以,即使我选择文件系统后端,我也会因为状态太大而得到oom?我认为这只发生在堆状态后端。是的,OOM可能发生在
fsstatebend
中。请参见此处@yaarix
fsstatebend
的名称让我感到困惑。
Fs
(文件系统)部分指的是检查点的存储位置,而不是函数使用的本地状态的存储方式。对于
rocksdbstatebend
而言,这是另一种方式。RocksDB是本地状态存储,检查点也存储在(分布式)文件系统中。