1。你需要先了解的一些背景在说背景之前,先说一下题目的结论:你配置的rocksdb只会影响keyedstate在flinktask中的存储方式和位置,而operatorstate在flinktask中flink任务不会受到影响。状态:状态是用户在程序中使用的数据结构。比如flink中的MapState、ValueState、ListState。在一个flink任务中,无论我们使用多少状态,这些状态只会分为两种:operator状态和keyed状态。状态管理:为了防止长时间运行的flink任务挂掉造成状态丢失和数据质量问题,flink提供了状态管理(Checkpoint、Savepoint)能力来管理我们使用的状态,并定时保存到远程。然后,当flinktaskfailover时,状态数据可以从remote恢复到flinktask中,保证数据质量。状态后端:状态后端决定了用什么样的数据结构和存储方式来存储和管理我们的状态。Flink目前官方提供了memory、filesystem、rocksdb三种statebackend来存储我们的state。2、配置不同状态后端时,对flink任务有什么影响?其实所有的内容都浓缩成这张图:SQL开发横向分为Operatorstate-backend和Keyedstate-backend(行)。垂直(columnally)管理一个flink任务中的所有状态(operatorstate,keyedstate),用户可以配置memory,filesystem,rocksdb在flink任务中生成MemoryStateBackend,FsStateBackend,RocksdbStateBackend,声明了整个task中的状态内容管理后端类型的每个grid是用户配置xx状态后端(列)时为用户使用的状态(行)生成的状态后端实例,生成的实例用于管理用户使用的状态.那么可以得出的结论是:flink任务中的算子状态。无论用户配置哪种状态后端(无论是内存、文件系统、rocksdb),都由DefaultOperatorStateBackend管理,状态数据存储在内存中。flink任务中的keyed状态会有所不同。用户在配置rocksdb时,会使用RocksdbKeyedStateBackend来管理状态;当用户配置内存和文件系统时,他们将使用HeapKeyedStateBackend来管理状态。换句话说,你配置的rocksdb只会影响keyedstate的存储方式和位置,而operatorstate不会受到影响。
