Flink Checkpoint

1. 目的

为了实现flink任务的容灾与恢复

2. 概念以及实现原理

  • 状态state:指算子或算子并发中的状态数据,与数据流有关系,随流入数据而变化。(例如统计某个算子处理的记录总数)
状态存储
  • 屏障barrier
    barrier作为数据流的一部分随着记录被注入到数据流中。barrier永远不会赶超通常的流记录,它会严格遵循顺序。barrier将数据流中的记录隔离成一系列的记录集合,并将一些集合中的数据加入到当前的快照中,而另一些数据加入到下一个快照中。每一个barrier携带着快照的ID。barrier不会中断流处理,因此非常轻量级。
    barrier的意义就在于,它到达某个算子时,相当于告诉算子,前一个barrier到当前barrier之间的数据都已经到达了
barrier

如果是Exactly Once的模式,会有一个对齐操作。当一个算子有多个入度时,如果一个输入流的某个barrier先到,必须等另一个流相同ID的barrier到达后才能继续放入新的数据。

如果是At Least Once模式,则不会有对齐操作,第一个流的barrier到达后,不会等另一个流的同ID的barrier到达,而是继续放入该流的数据;等第二个流的同ID的barrier到达后,才会触发快照的保存,但此时保存的算子状态是包含了这个barrier之后的数据的,所以不是exactly once而是at least once

双流对齐
  • 快照snapshot
    某一个时机将算子的状态保存下来,注意这里的时机通常不是自然时间意义上的,而是当barrier到达算子时触发。快照是分布式的,也就是当barrier到达某个算子的时候对其进行快照,由于barrier带有ID,因此不同算子在同一个ID下的分布式快照组成一个完整地快照,即使这个快照可能并不是同一个时间产生的,也不是存储在同一个地方。
快照存储
快照恢复
  • 可部分重发的数据源
    可以指定历史数据的位置重放数据,比如Kafka可以持久化数据,并通过偏移量来读取历史数据。

  • 检查点机制checkpoint
    由上可知,同一个id的barrier在经过job中的算子时,都会拍摄snapshot,将算子的state保存下来,所有算子在这个id下的snapshot就是一个checkpoint。它表示的意义是:该barrier之前的数据已经全都处理完并流出job执行图,并且该barrier之后的数据全都没有进入job执行图时候的所有算子的状态。因此如果程序因故中断,需要恢复到某个checkpoint时,只需要把所有算子的状态都恢复到保存该checkpoint的snapshots,然后利用可重发的数据源发送该barrier之后的数据即可。

你可能感兴趣的:(Flink Checkpoint)