内存级状态后端 单独的Memory
键控状态作为内存中的对象保存在TaskManager的JVM堆上上。
chickpoint 检查点 JobManager的内存
1.MM 2.FS 3.RSDB
一:每传入一条数据,有状态的算子任务都会读取状态
状态分类:1:MemoryStateBackend
键控状态存在TaskManager的jvm堆上
chickpoint存储在JobManager的内存中
2: FsStateBackend:将checkpoint存储在远程持久化文件系统(FileSystem)
3:RocksDBStateBackend:序列化后存入本地的RockDB中存储。
二:Flink容错机制:就是state不丢
一致性检查点 checkpoint 故障恢复 在某一个时间点对任务做快照
save points
Source 5 为读取数据的偏移量
6,9分别为不同的slot内的结果存盘
完整的checkpoint必须是所有任务都已经处理完的数据
exectly once 状态一致性。
检查点算法:
基于Chandy-Lamport算法的分布式快照
将检查点的保存和数据处理分离开,不暂停整个应用。
检查点分界线Checkpoint Barrier
Barrier传递规则:算法
watermark要等到所有的分区的watermark都达到摸个时间,找最小智,才推进到该状态
Barrier收集所有上游数据Barrier。
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.AT_LEAST_ONCE) //调低jibie
env.getCheckpointConfig.setCheckpointTimeout(60000) //超时时间
env.getCheckpointConfig.setMaxConcurrentCheckpoints(2) //允许同时并行的最大Checkpoint
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(1000) //两次保存时至少的时间间隔
env.getCheckpointConfig.setPreferCheckpointForRecovery(false) //false下与手动保存哪个近用哪个
重启策略:
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,10000L)) //重启3次 每次间隔10s
env.setRestartStrategy(RestartStrategies.failureRateRestart(5,Time.of(5,TimeUnit.MINUTES),Time.of(10,TimeUnit.SECONDS)))
保存点 Savepoints
使用场景:停止应用后重新启动
四:状态一致性分类(Flink内部状态一致性)
·1.AT-MOST-ONCE 不做任何处理 既不恢复丢失的状态,也不重播丢失的数据。最多处理一次。UDP
2.AT-LEAST-ONCE
3.EXACTLY-ONCE
一致性检查点(Checkpoints)
检查点来保证exectly-once语义
Flink使用轻量级快照来保证exectly-once
五:端到端 (Flink必须可以保证偏移量可以重置 kafka)
六:端到端状态一致性 = source + flink + sink
内部保证-checkpiont
source端-可以重置数据的读取位置 kafka
sink端 1:幂等写入 多次写入结果一样 hashmap
2:事务写入 写入必须开启事务 构建的事务对应着checkpoint
实现方式 a:-----》GenericWriteAheadSink预写日志 wal 先写入预写日志 等chenkpoint后再一次提交wal
b:------》两阶段提交(Two-Phase-Commit,2PC)(预提交–提交)
对于每个checkpoint,sink任务会启动一个事务,并将接下来的所有接受的数据添加到事务里。预提交。当他收到checkpoint完成通知时,他才正式提交事务,实现结果的真正写入。
这种方式真正实现了exactly-once:
要完成两阶段提交 必须外部系统支持事务 Mysql
TwoPhaseCommitSinkFunction接口
流程 开启事务 等待checkpoint通知 提交事务
![在这里插入图片描述]()
Flink+Kafka实现端到端状态一致性保证
1.内部-利用checkpoint机制,把状态存盘。发生故障时恢复,保证内部的状态一致性
2.source------kafka consumer 作为source ,可以将偏移量把偶才能起来。
3.sink----------kafka producer 作为sink.采用两阶段提交,需要实现一个TwoPhaseCommitSinkFunction
• 第一条数据来了之后,开启一个 kafka 的事务(transaction),正常写入 kafka 分
区日志但标记为未提交,这就是“预提交”
• jobmanager 触发 checkpoint 操作,barrier 从 source 开始向下传递,遇到 barrier
的算子将状态存入状态后端,并通知 jobmanager
• sink 连接器收到 barrier,保存当前状态,存入 checkpoint,通知 jobmanager,并
开启下一阶段的事务,用于提交下个检查点的数据
• jobmanager 收到所有任务的通知,发出确认信息,表示 checkpoint 完成
• sink 任务收到 jobmanager 的确认信息,正式提交这段时间的数据
• 外部kafka关闭事务,提交的数据可以正常消费了。