当前位置:   article > 正文

全面剖析Flink CheckPoint机制与Exactly Once和At Least Once语义_flink cdc → kafka → flink,通过 checkpoint + sink kaf

flink cdc → kafka → flink,通过 checkpoint + sink kafka exactly once + kafk

看完本文,你能掌握以下知识:

  1. CheckPoint 如何保障 Flink 任务的高可用
  2. CheckPoint 中的状态简介
  3. 如何实现全域一致的分布式快照?
  4. 什么是 barrier?什么是 barrier 对齐?
  5. 为什么 barrier 对齐就是 Exactly Once,为什么 barrier 不对齐就是 At Least Once

Flink 简介

Flink 是一个流式处理框架,支持有状态的计算。状态数据是指在处理每个元素或事件时,系统存储的数据,这些数据可以修改、查询,并根据业务需求保存历史数据或中间结果。

例子:

  • 当应用程序搜索事件模式时,状态存储当前遇到的事件序列。
  • 在进行定时事件聚合时,状态保存待处理的聚合结果。
  • 在数据流上训练机器学习模型时,状态保持模型参数的当前版本。
  • 在管理历史数据时,状态允许高效访问过去发生的事件。

什么是状态?

无状态计算的例子:

  • 字符串拼接,如输入 a 输出 a_666,输入 b 输出 b_666。结果与之前状态无关,符合幂等性。

有状态计算的例子:

  • 计算 PV、UV。结果与之前状态有关,不符合幂等性,访问多次 PV 会增加。

Flink 的 CheckPoint 功能简介

  1. CheckPoint 的作用
    CheckPoint 是为了在任务故障后恢复任务状态,保证任务的高可用。它通过快照保存任务状态,当任务挂掉后,从最近一次的完整快照恢复。

  2. 快照是什么?
    快照(Snapshot)是将程序在某一时刻的状态保存下来,便于后续恢复。以 PV 统计为例,我们从 Kafka 读取日志,将统计结果保存到内存中并定期做快照。

    快照示例

  3. CheckPoint 保存的信息

    • Kafka 消费的 offset,如 (0, 1000)。
    • PV 统计数据,如 (app1, 50000) 和 (app2, 10000)。
    • 状态后端保存的状态信息,例如 chk-100,记录了 offset 和 PV 数据。
  4. 任务恢复

    • 如果任务挂掉,Flink 从最近一次成功的 CheckPoint 恢复任务,重新消费数据并恢复状态。例如,从 chk-100 恢复,offset 为 (0, 1000) 和 PV 为 (app1, 50000) 和 (app2, 10000)。
  5. 如何保证快照的准确性

    • CheckPoint 使用 barrier 机制,所有任务在接收到 barrier 后,暂停数据处理,进行快照保存。

    Barrier 机制示例


barrier 对齐

什么是 barrier 对齐?

  • 一旦 Operator 接收到 CheckPoint barrier n,它必须等到所有输入流的 barrier n 都到达后,才能继续处理数据记录。这避免了混合快照 n 和快照 n+1 的数据记录。

    Barrier 对齐示例

什么是 barrier 不对齐?

  • 当 barrier 不对齐时,Operator 可能会在未收到所有输入流的 barrier 时继续处理数据,可能导致重复处理或数据丢失。

为什么 barrier 对齐是 Exactly Once?

  • 对齐的 barrier 确保所有数据在快照时被处理,不会出现重复消费。举例:在 checkpoint 中,barrier 对齐的情况不会有重复消费,而不对齐的情况可能出现重复消费。

    Barrier 不对齐示例

总结

  • Exactly Once: 必须 barrier 对齐,确保每条记录仅被处理一次。

  • At Least Once: 如果 barrier 不对齐,可能会出现数据重复处理。

    状态交互示例

多并行度、多 Operator 情况下的 CheckPoint 过程

  1. 分布式状态容错问题

    • 确保状态的精确一次容错。
    • 在分布式场景下产生全域一致的快照。
    • 不中断运算地产生快照。
  2. 全域一致的快照

    • 所有 Operator 在接收到 barrier 后,执行快照操作,保存到状态后端。

    全域一致快照示例

  3. 状态恢复

    • 根据保存的快照状态,恢复各个 Operator 的状态。

    状态恢复示例

  4. CheckPoint 执行过程

    • JobManager 向 SourceTask 发送 CheckPointTrigger,SourceTask 插入 barrier 并开始快照操作。

    CheckPoint 执行示例

    • 当所有任务完成快照后,CheckPointCoordinator 汇总状态信息,写入持久化存储。

结论

通过确保 barrier 对齐,Flink 能够提供 Exactly Once 语义,避免数据丢失和重复消费。而不对齐的 barrier 则可能导致 At Least Once 的语义,可能出现重复处理数据的情况。


希望这篇博客能够帮助你更好地理解 Flink 的 CheckPoint 机制以及 barrier 对齐的重要性。如果你有任何问题或需要进一步的解释,请随时联系我!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/975525
推荐阅读
相关标签
  

闽ICP备14008679号