flink-checkpoint和状态后端存储(十一)
1.checkPoint简介
为了保证state的容错性,Flink需要对state进行checkpoint。
Checkpoint是Flink实现容错机制最核心的功能,它能够根据配置周期性地基于Stream中各个Operator/task的状态来生成快照,从而将这些状态数据定期持久化存储下来,当Flink程序一旦意外崩溃时,重新运行程序时可以有选择地从这些快照(最近一次的快照)进行恢复,从而修正因为故障带来的程序数据异常
Flink的checkpoint机制可以与(stream和state)的持久化存储交互的前提:
持久化的source,该source需要具备在一定时间内重放事件的功能。这种sources的典型例子是持久化的消息队列(比如Apache Kafka,RabbitMQ等)或文件系统(比如HDFS,S3,GFS等)
用于state的持久化存储,例如分布式文件系统(比如HDFS,S3,GFS等)
2.checkPoint的配置
默认checkpoint功能是disabled的,想要使用的时候需要先启用
checkpoint开启之后,默认的checkPointMode是Exactly-once
checkpoint的checkPointMode有两种,Exactly-once和At-least-once
Exactly-once对于大多数应用来说是最合适的。At-least-once可能用在某些延迟超低的应用程序(始终延迟为几毫秒)
默认checkpoint功能是disabled的,想要使用的时候需要先启用,代码在State Backend内容介绍下面
checkpoint可以存储在哪儿?请看下面:State Backend
3.状态后端
1.每传入一条数据,有状态的算子任务都会读取和更新状态
2.由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问
3.状态的存储、访问以及维护,有一个可插入的组件决定,这个组件叫做状态后端
4.状态后端主要负责两件事:本地的主要管理,以及将检查点状态写入远程存储
4.状态后端分类
1.MemoryStateBackend
- 内存级的状态后端,会将键控状态作为内存中的对象进行管理,将他们存储在TaskManager的JVM堆上,而将checkpoint存储在JobManager的内存中
- 特定:快速、低延迟但不稳定
2.FsStateBackend
- 将checkpoint存到远程的持久化文件系统上,而对于本地状态,跟MemoryStateBackend一样,也会存在taskmanager的JVM堆上
- 同时拥有内存级的本地访问速度,和更好的容错性
3.RocksDBStateBackend
- 将所有的状态序列化后,存入本地RocksDB中存储