yaa*_*rix 3 stream-processing apache-flink
在阅读了flink的文档并四处搜寻之后,我无法完全理解flink的窗口中如何处理状态。可以说我有一个每小时运行的带有聚合函数的滚动窗口,该函数将msg累积到某些Java pojo或scala case类中。该窗口的大小将与在一小时内进入该窗口的事件的数量相关,或者仅将其与pojo / case类相关,因为会将事件累积到该对象中。(例如,如果将10000 msgs计数为整数,大小将接近10000 * msg大小还是int的大小?)此外,如果im使用pojos或case类,flink是否会为我处理状态(如果内存溢出到磁盘)在检查点用尽/保存状态等)还是我必须使用flink的状态对象?
谢谢你的帮助!
窗口的状态大小取决于您应用的功能类型。如果您应用ReduceFunction或AggregateFunction,则会立即汇总到达的数据,并且窗口仅保存汇总的值。如果应用ProcessWindowFunction或WindowFunction,则Flink将收集所有输入记录并在时间(事件或处理时间取决于窗口类型)超过窗口的结束时间时应用该函数。
您还可以组合两种类型的函数,即,AggregateFunction后跟一个ProcessWindowFunction。在这种情况下,将立即汇总到达的记录,并且在关闭窗口时,汇总结果将作为单个值传递给ProcessWindowFunction。这很有用,因为您可以进行增量聚合(由于ReduceFunction/ AggregateFunction),还可以访问窗口元数据,例如开始和结束时间戳记(由于ProcessWindowFunction)。
状态的管理方式取决于所选的状态后端。如果配置了FsStateBackend所有本地状态,则将其保留在TaskManager的堆上,并且OutOfMemoryError如果状态太大,则JVM进程将被杀死。如果配置,则RocksDBStateBackend状态会溢出到磁盘。这会带来每个状态访问的反序列化成本,但会为状态提供更多的存储空间。
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |