在阅读了flink的文档并四处搜索之后,我无法完全理解flink是如何处理windows中的状态的。假设我有一个每小时滚动的窗口,其中包含一个聚合函数,该函数将msg累积到一些javapojo或scala case类中。该窗口的大小是与一小时内进入该窗口的事件数相关联,还是仅与pojo/case类相关联,因为我正在将事件累积到该对象中(e、 g如果将10000个msg计算成整数,大小是否接近10000*msg size或int的大小?)另外,如果我使用pojo或case类,flink是否为我处理状态(如果内存耗尽/在检查点保存状态等),或者我必须使用flink的state对象吗?
谢谢你的帮助!
1条答案
按热度按时间aurhwmvo1#
窗口的状态大小取决于应用的函数类型。如果你申请
ReduceFunction
或者AggregateFunction
,到达的数据立即聚合,窗口仅保存聚合值。如果你申请ProcessWindowFunction
或者WindowFunction
,flink收集所有输入记录,并在时间(事件或处理时间取决于窗口类型)超过窗口的结束时间时应用该函数。您还可以组合这两种类型的函数,即
AggregateFunction
接着是一个ProcessWindowFunction
. 在这种情况下,到达的记录将立即聚合,当窗口关闭时,聚合结果将作为单个值传递给ProcessWindowFunction
. 这很有用,因为您有增量聚合(由于ReduceFunction
/AggregateFunction
)还可以访问窗口元数据,如开始和结束时间戳(由于ProcessWindowFunction
).如何管理状态取决于所选的状态后端。如果您配置
FsStateBackend
所有本地状态都保存在taskmanager的堆中,jvm进程将被一个OutOfMemoryError
如果国家发展太大。如果您配置RocksDBStateBackend
状态已溢出到磁盘。这会为每个状态访问带来反序列化成本,但会为状态提供更多的存储空间。