什么是状态后端?
- 每传入一条数据,有状态的算子任务都会读取和更新状态
- 由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问
- 状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端(state backend)
- 状态后端主要负责两件事:本地的状态管理,以及将检查点(checkpoint)状态写入远程存储
状态后端的存储模式
MemoryStateBackend
- 内存级的状态后端,会将键控状态作为内存中的对象进行管理,将它们存储在TaskManager的JVM堆上,而将checkpoint存储在JobManager的内存中
- 特点:快速、低延迟,但不稳定
- 源码
public MemoryStateBackend() {
this(null, null, DEFAULT_MAX_STATE_SIZE, TernaryBoolean.UNDEFINED);}
- 示例
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//配置使用MemoryStateBackend
env.setStateBackend(new MemoryStateBackend)
FsStateBackend
- 将checkpoint 存到远程的持久化文件系统(FileSystem) 上,而对于本地状态,跟MemoryStateBackend - -样,也会存在TaskManager的JVM堆上
- 同时拥有内存级的本地访问速度, 和更好的容错保证
- 源码
public FsStateBackend(String checkpointDataUri) {
this(new Path(checkpointDataUri));}
- 示例
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//配置使用FsStateBackend
env.setStateBackend(new FsStateBackend("存储路径"))
RocksDBStateBackend
- 将所有状态序列化后,存入本地的RocksDB中存储。
RocksDBStateBackend比较特殊,如果需要使用,需要添加依赖:
根据自己的使用的scala和flink版本进行修改
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-statebackend-rocksdb_2.11</artifactId>
<version>1.10.1</version>
</dependency>
- 源码
public RocksDBStateBackend(String checkpointDataUri, boolean enableIncrementalCheckpointing) throws IOException {
this((new Path(checkpointDataUri)).toUri(), enableIncrementalCheckpointing);
}
- 示例
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//RocksDBStateBackend除了配置存储路径,还需要配置是否增量存储,否则就是全量存储
env.setStateBackend(new RocksDBStateBackend("存储路径",true))