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



阅读了Flink的文档和搜索后,我无法完全理解Flink在其窗户中的处理状态。可以说,我有一个每小时的翻滚窗口,其聚合函数将MSG积聚到某些Java Pojo或Scala Case类中。该窗口的大小是否会在一个小时内进入该窗口的事件数量,还是将其与Pojo/case类绑定,因为即时消息将事件累积到该对象中。(例如,如果将10000个毫克计入整数,该大小接近10000 * msg尺寸或int的大小?)另外,如果我使用pojos或案例类,flink是否会为我处理状态(如果内存耗尽/保存在检查点等状态等状态,则泄漏),还是我必须使用flink的状态对象为此?

感谢您的帮助!

窗口的状态大小取决于您应用的函数类型。如果应用ReduceFunctionAggregateFunction,则立即汇总到达数据,并且该窗口仅保留汇总值。如果您应用ProcessWindowFunctionWindowFunction,Flink会收集所有输入记录,并在时间(事件或处理时间取决于窗口类型)时应用该功能,则会通过窗口的结束时间。

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

如何管理状态取决于所选状态后端。如果配置FsStateBackend,则所有本地状态都将保留在任务管理器的堆上,并且如果状态生长太大,则JVM进程被OutOfMemoryError杀死。如果配置RocksDBStateBackend状态溢出到磁盘。这带有每个州访问的DE/序列化成本,但为州提供了更多的存储空间。

相关内容

  • 没有找到相关文章

最新更新