Flink的checkPoint原理
1.知识前置
Flink检查点算法:检查点分界线(Checkpoint Barrier)
Flink 的检查点算法用到了一种称为分界线(barrier)的特殊数据形式,用来把一条流上数据按照不同的检查点分开。
2.正文开始
*2.1.*JobManager 会向每个 source 任务发送一条带有新检查点 ID 的消息,通过这种方式来启动检查点,检查点分界线由 source 算子注入到常规的数据流中,它的位置是限定好的,不能超过其他数据,也不能被后面的数据超过。
*2.2.*当source源遇到检查点分界线时,就会把自身维护的最新状态(偏移量)保存到状态后端中去并继续处理数据,同时向其下游发送检查点分界线;当状态后端存完检查点之后,就会通知source任务,source任务就会向JobManager确认检查点完成。
主要通过检查点分界线(checkPoint),这个由JobManager产生的特殊形式并插入到流数据中,先从Source源出开始插入并向下游并行的子任务广播下去。
*2.3.*检查点分界线向下游传递时候,当下游的算子存在多个任务的输入时,所以会接受到多个检查点分界线;此时就会算子就必须要等待上游各个任务的检查点分界线都到齐,实现分界线“对齐”才可以开始启动检查点保存操作,注意如果一个算子其中一个上游任务分界线已经到达该算子,并且这个任务又有数据到达该算子时,这时候就不会处理该数据的,因为这个算子的其他任务的分界线还没达到/还没对齐,只有对齐之后,才表明整个应用程序才保存同一个完整的分布式快照,所以这个数据就不会被这个算子处理,而是被缓存起来,等待被处理状态。
当算子的所有上游任务检查点分界线都对齐之后,该算子就会把状态保存在状态后端的检查点中,然后算子就会继续把分界线向下游任务转发,转发之后,该算子就正常处理任务了。同样该算子接收到状态后端检查点已保存之后通知之后,就会向JobManager确认检查点操作已完成。
*2.4.*同样Sink任务接收得到检查点分界线并对齐之后,就会启动保存状态操作,到向JobManger确认检查点操作已完成。但是当所有任务都确认都成功将状态保存到检查点时,检查点就真正完成的;需要注意的时sink任务向外部系统写入任务时的注意点(下次在详解)。
2.5.总结:以上介绍异步分界线快照是flink内部实现精准一次的原理;但是要实现端到端精准一次,也是需要外部系统支持精准一次才可以(例如:kafka>flink>kafka)。flink故障恢复的核心就是一致性检查点,flink会定期保存状态的一致性检查点。当flink遇到故障重启时,就会从最近一次检查点恢复应用状态。即会从checkPoint中读取状态,将状态重启。则从检查点重启应用之后,应用程序的source到sink这个过程中,状态就恢复同检查点一样的状态。那么流程序就会重新从检查点才开始处理数据,那么在检查点到发送故障之间的数据同样也会被处理的,所以
就是实现精准一次性操作。