Exactly-Once语义在Flink中的实现(二) | 青训营笔记

102 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第3天

Exactly—Once和Checkpoint

1. 状态快照与恢复

定期保存和恢复,与电脑差不对的思路

image.png

2. 制作快照的时间点

  • 状态恢复的时间点:需要等待所有处理逻辑消费完成source保留状态及之前的数据
  • 一个简单的快照制作算法
    1. 暂停处理输入的数据。
    1. 等待后续所有处理算子消费当前已经输入的数据。
    1. 待2处理完成后,作业所有算子赋值自己的状态并保存到远端可靠存储。

如果时间选择不够好,可能存在丢失数据的情况

3. Chandy——lamport算法

image.png

(1)快照制作的开始

每一个source算子都接收JM发送的Checkpoint Barrier标识状态快照制作的开始

image.png

(2)Source算子的处理

各个source保存自己状态,向所有连接的下游继续发送Checkpoint Barrier,同时的告知JM自己状态已经制作完成

image.png

(3)Barrier Alignment

  • 算子会等待所有上游的barrier到达后才开始快照的制作
  • 已经制作完成的上游算子会继续处理数据,并不会被下游算子制作快照的过程阻塞

image.png

(4)快照制作和处理数据的解耦

image.png

(5)checkpoint的结果

所有算子都告知JM状态制作完成后,整个Checkpoint就结束了

image.png

4. Checkpoint对作业性能的影响

  1. 解耦了快照制作和数据处理过程,各个算子制作完成状态快照后就可以正常处理数据,不用等下游算子制作完成快照;
  2. 在快照制作和Barrier Alignment过程中需要暂停处理数据,仍然会增加数据处理延迟;
  3. 快照保存到远端也有可能极为耗时