看完本文,你能掌握以下知识:
- CheckPoint 如何保障 Flink 任务的高可用
- CheckPoint 中的状态简介
- 如何实现全域一致的分布式快照?
- 什么是 barrier?什么是 barrier 对齐?
- 为什么 barrier 对齐就是 Exactly Once,为什么 barrier 不对齐就是 At Least Once
Flink 简介
Flink 是一个流式处理框架,支持有状态的计算。状态数据是指在处理每个元素或事件时,系统存储的数据,这些数据可以修改、查询,并根据业务需求保存历史数据或中间结果。
例子:
- 当应用程序搜索事件模式时,状态存储当前遇到的事件序列。
- 在进行定时事件聚合时,状态保存待处理的聚合结果。
- 在数据流上训练机器学习模型时,状态保持模型参数的当前版本。
- 在管理历史数据时,状态允许高效访问过去发生的事件。
什么是状态?
无状态计算的例子:
- 字符串拼接,如输入 a 输出 a_666,输入 b 输出 b_666。结果与之前状态无关,符合幂等性。
有状态计算的例子:
- 计算 PV、UV。结果与之前状态有关,不符合幂等性,访问多次 PV 会增加。
Flink 的 CheckPoint 功能简介
-
CheckPoint 的作用
CheckPoint 是为了在任务故障后恢复任务状态,保证任务的高可用。它通过快照保存任务状态,当任务挂掉后,从最近一次的完整快照恢复。 -
快照是什么?
快照(Snapshot)是将程序在某一时刻的状态保存下来,便于后续恢复。以 PV 统计为例,我们从 Kafka 读取日志,将统计结果保存到内存中并定期做快照。 -
CheckPoint 保存的信息
- Kafka 消费的 offset,如 (0, 1000)。
- PV 统计数据,如 (app1, 50000) 和 (app2, 10000)。
- 状态后端保存的状态信息,例如 chk-100,记录了 offset 和 PV 数据。
-
任务恢复
- 如果任务挂掉,Flink 从最近一次成功的 CheckPoint 恢复任务,重新消费数据并恢复状态。例如,从 chk-100 恢复,offset 为 (0, 1000) 和 PV 为 (app1, 50000) 和 (app2, 10000)。
-
如何保证快照的准确性
- CheckPoint 使用 barrier 机制,所有任务在接收到 barrier 后,暂停数据处理,进行快照保存。
barrier 对齐
什么是 barrier 对齐?
-
一旦 Operator 接收到 CheckPoint barrier n,它必须等到所有输入流的 barrier n 都到达后,才能继续处理数据记录。这避免了混合快照 n 和快照 n+1 的数据记录。
什么是 barrier 不对齐?
- 当 barrier 不对齐时,Operator 可能会在未收到所有输入流的 barrier 时继续处理数据,可能导致重复处理或数据丢失。
为什么 barrier 对齐是 Exactly Once?
-
对齐的 barrier 确保所有数据在快照时被处理,不会出现重复消费。举例:在 checkpoint 中,barrier 对齐的情况不会有重复消费,而不对齐的情况可能出现重复消费。
总结
-
Exactly Once: 必须 barrier 对齐,确保每条记录仅被处理一次。
-
At Least Once: 如果 barrier 不对齐,可能会出现数据重复处理。
多并行度、多 Operator 情况下的 CheckPoint 过程
-
分布式状态容错问题
- 确保状态的精确一次容错。
- 在分布式场景下产生全域一致的快照。
- 不中断运算地产生快照。
-
全域一致的快照
- 所有 Operator 在接收到 barrier 后,执行快照操作,保存到状态后端。
-
状态恢复
- 根据保存的快照状态,恢复各个 Operator 的状态。
-
CheckPoint 执行过程
- JobManager 向 SourceTask 发送 CheckPointTrigger,SourceTask 插入 barrier 并开始快照操作。
- 当所有任务完成快照后,CheckPointCoordinator 汇总状态信息,写入持久化存储。
结论
通过确保 barrier 对齐,Flink 能够提供 Exactly Once 语义,避免数据丢失和重复消费。而不对齐的 barrier 则可能导致 At Least Once 的语义,可能出现重复处理数据的情况。
希望这篇博客能够帮助你更好地理解 Flink 的 CheckPoint 机制以及 barrier 对齐的重要性。如果你有任何问题或需要进一步的解释,请随时联系我!