阅读了Flink的文档和搜索后,我无法完全理解Flink在其窗户中的处理状态。可以说,我有一个每小时的翻滚窗口,其聚合函数将MSG积聚到某些Java Pojo或Scala Case类中。该窗口的大小是否会在一个小时内进入该窗口的事件数量,还是将其与Pojo/case类绑定,因为即时消息将事件累积到该对象中。(例如,如果将10000个毫克计入整数,该大小接近10000 * msg尺寸或int的大小?)另外,如果我使用pojos或案例类,flink是否会为我处理状态(如果内存耗尽/保存在检查点等状态等状态,则泄漏),还是我必须使用flink的状态对象为此?
感谢您的帮助!
窗口的状态大小取决于您应用的函数类型。如果应用ReduceFunction
或AggregateFunction
,则立即汇总到达数据,并且该窗口仅保留汇总值。如果您应用ProcessWindowFunction
或WindowFunction
,Flink会收集所有输入记录,并在时间(事件或处理时间取决于窗口类型)时应用该功能,则会通过窗口的结束时间。
您还可以组合两种类型的功能,即具有AggregateFunction
,然后是ProcessWindowFunction
。在这种情况下,到达记录会立即汇总,并且关闭窗口时,将聚合结果作为单个值传递给ProcessWindowFunction
。这很有用,因为您具有增量聚合(由于ReduceFunction
/AggregateFunction
),但也可以访问窗口元数据(例如开始和结束时间戳)(由于ProcessWindowFunction
)。
如何管理状态取决于所选状态后端。如果配置FsStateBackend
,则所有本地状态都将保留在任务管理器的堆上,并且如果状态生长太大,则JVM进程被OutOfMemoryError
杀死。如果配置RocksDBStateBackend
状态溢出到磁盘。这带有每个州访问的DE/序列化成本,但为州提供了更多的存储空间。