Flink状态后端

什么是状态后端?

  • 每传入一条数据,有状态的算子任务都会读取和更新状态
  • 由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问
  • 状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端(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))

猜你喜欢

转载自blog.csdn.net/weixin_38468167/article/details/112257632