我想知道状态的大小大于flink的内存大小。由于状态是由Flink App的api通过在代码级别定义MapState<K,V>
来控制的,因此状态可以存储大尺寸的值(超过内存大小,如100Gb,200Gb)。
这可能吗?
您可能有兴趣阅读State后端
HashMapStateBackend内部保存数据作为Java堆上的对象
HashMapStateBackend将OOM你的任务管理器,如果你的MapState
太大。
EmbeddedRocksDBStateBackend将运行中的数据保存在RocksDB数据库中,该数据库(默认情况下)存储在TaskManager本地数据目录
[…请注意,您可以保留的状态数量仅受可用磁盘空间的限制。与将状态保存在内存中的HashMapStateBackend相比,这允许保存非常大的状态。然而,这也意味着使用此状态后端可以实现的最大吞吐量将更低。所有从/到此后端的读/写都必须通过反/序列化来检索/存储状态对象,这也比始终使用堆上表示(如基于堆的后端所做的那样)更昂贵。
EmbeddedRocksDBStateBackend将使用磁盘,因此您有更多的容量。请注意,它比较慢,但缓存可以帮助缓解一些慢;我建议你看看这个配置(在Flink中使用RocksDB的机制)