Flink端到端的一致性
- source端(kafka consumer)
偏移量保存下来, 如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新 消费数据,保证一致性。
- 内部 (checkpoint 机制)
• 基于 Chandy-Lamport 算法的分布式快照算法
• 将检查点的保存和数据处理分离开,不暂停整个应用
检查点分界线(Checkpoint Barrier,检查点屏障)
• Flink 的检查点算法用到了一种称为分界线(barrier)的特殊 数据形式,用来把一条流上数据按照不同的检查点分开
• 分界线之前到来的数据导致的状态更改,都会被包含在当前 分界线所属的检查点中;而基于分界线之后的数据导致的所 有更改,就会被包含在之后的检查点中
过程:
1 某一个程序正常执行(2条输入流/两个并行度皆可),某一时刻,jobManger向每个Source 任务发送新的检查点id信息,启动最初的检查点。
2 数据源将它们的状态写入检查点,发出一个检查点的barrier,状态后端待状态存入检查点,通知Source任务,Source向jobManger确认检查点完成。
3 Barrier向下游发送,操作任务会等待所有的相同Barrier到达,先到达的等后到达的,此时数据缓存(后来者居上的数据),继续等其他分区的barrier到达。
4 到达后,任务将状态保存到状态后端,Barrier继续向下游转发,任务继续执行
5 Sink向jobmanger确认状态保存到checkpoint,所有任务到达,则检查点完成。
- sink(kafka producer)**
下级存储支持事务:Flink 可以通过实现两阶段提交和状态保存来实现端到端的一致性 语义。 分为以下几个步骤:
1)开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面
2)预提交(preCommit)将内存中缓存的数据写入文件并关闭
3)正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据 会有一些延迟
4)丢弃(abort)丢弃临时文件
5)若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。
如果下级存储不支持事务:
具体实现是幂等写入,需要下级存储具有幂等性写入特性。