内存级状态后端 单独的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

flink source sink 数据清洗 flink rocksdb状态清理_检查点


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

flink source sink 数据清洗 flink rocksdb状态清理_检查点_02


• 第一条数据来了之后,开启一个 kafka 的事务(transaction),正常写入 kafka 分

区日志但标记为未提交,这就是“预提交”

• jobmanager 触发 checkpoint 操作,barrier 从 source 开始向下传递,遇到 barrier

的算子将状态存入状态后端,并通知 jobmanager

• sink 连接器收到 barrier,保存当前状态,存入 checkpoint,通知 jobmanager,并

开启下一阶段的事务,用于提交下个检查点的数据

• jobmanager 收到所有任务的通知,发出确认信息,表示 checkpoint 完成

• sink 任务收到 jobmanager 的确认信息,正式提交这段时间的数据

• 外部kafka关闭事务,提交的数据可以正常消费了。