订阅更新

Checkpoint与容错:任务挂了数据不丢的秘密

Flink 实时计算 20 天 · 第 5 讲 进阶 约 6 分钟读完

Checkpoint · Savepoint · Barrier对齐 · 增量Checkpoint

本文目录
  1. 📋 面试题
  2. Checkpoint解决什么问题?
  3. Checkpoint执行流程
  4. 关键配置
  5. Checkpoint vs Savepoint
  6. 面试加分提示
  7. 📌 总结

📋 面试题

Flink的Checkpoint机制是怎么工作的?Checkpoint和Savepoint有什么区别?

💡 先想30秒,再往下看答案


Checkpoint解决什么问题?

实时任务7x24小时运行,一定会遇到故障(机器挂了、OOM、网络抖动)。故障恢复后,怎么保证数据不丢、不重复?

答案就是Checkpoint:定期把所有算子的State和Source的消费位点(如Kafka offset)保存到持久化存储(HDFS/S3),故障恢复时从最近的Checkpoint恢复。

Checkpoint执行流程

1. JobManager 定时触发 Checkpoint(如每60秒)
2. 向所有Source注入Barrier(屏障)
3. Barrier随数据流向下游传递
4. 每个算子收到所有上游的Barrier后:
   - 暂停处理(对齐)
   - 把State快照写到持久化存储
   - 继续处理
5. 所有算子完成快照 → Checkpoint成功

Barrier对齐(核心原理)

Source[0] —— data data [Barrier] data data ——→ 算子
Source[1] —— data data data [Barrier] data ——→ 算子

算子收到Source[0]的Barrier后:
  暂停处理Source[0]的数据,等Source[1]的Barrier
  Source[1]的Barrier到达后:
  做State快照 → 继续处理

💡 Barrier对齐会增加延迟。如果某个上游很慢,下游要一直等它的Barrier。Flink 1.11引入了非对齐Checkpoint(Unaligned Checkpoint),不等对齐直接做快照,把未处理的Buffer数据也保存进Checkpoint,用空间换延迟。

关键配置

// Checkpoint配置
env.enableCheckpointing(60000);  // 每60秒
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setCheckpointTimeout(180000);  // 超时3分钟
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000);  // 两次间隔至少30秒
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);  // 同时最多1个

// State Backend
env.setStateBackend(new EmbeddedRocksDBStateBackend(true));  // true=增量Checkpoint
env.getCheckpointConfig().setCheckpointStorage("hdfs:///flink/checkpoints");

增量Checkpoint

全量Checkpoint每次把所有State都写一遍,State越大越慢。增量Checkpoint只写上次以来变化的部分。

全量:每次写50GB → 耗时2分钟
增量:每次只写变化的2GB → 耗时10秒

State越大,增量的优势越明显

我们State有20GB+,用增量Checkpoint后,从每次90秒降到15秒。生产环境RocksDB + 增量Checkpoint基本是标配。

Checkpoint vs Savepoint

对比 Checkpoint Savepoint
触发方式 自动定时 手动触发
用途 故障恢复 版本升级、作业迁移
格式 可能有Backend特定格式 标准化格式,Backend无关
生命周期 任务取消后可配置保留 永久保留直到手动删除
# 手动触发Savepoint
flink savepoint <jobId> hdfs:///flink/savepoints

# 从Savepoint恢复
flink run -s hdfs:///flink/savepoints/savepoint-xxx ...

每次上线新版本前,我们先触发Savepoint,再停任务、部署新版、从Savepoint恢复。如果新版有Bug,还能用旧Savepoint回滚。

面试加分提示

💡 回答Checkpoint要讲清楚三个层次:

「Checkpoint定期把State和消费位点保存到HDFS,故障恢复时从最近的Checkpoint恢复。核心原理是Barrier对齐——所有上游的Barrier到齐后做State快照。

我们用RocksDB + 增量Checkpoint,State 20GB的任务Checkpoint从90秒降到15秒。

Savepoint是手动触发的,用于版本升级和回滚。每次上线前先打Savepoint,新版有问题还能回退。」

📌 总结

记忆点 内容
Checkpoint 定期快照State+消费位点,故障恢复用
Barrier对齐 等所有上游Barrier到齐再快照
增量Checkpoint 只写变化部分,State大时必用
生产配置 RocksDB + 增量 + HDFS存储
Savepoint 手动触发,用于升级和回滚

▶ 下一篇预告:DAY 6 Exactly-Once语义


Wood聊大数据 | 9年大数据老兵,聊技术、聊职场、聊成长


小红书正文

Flink任务挂了数据不丢,靠的就是Checkpoint。

原理:定期往数据流注入Barrier,所有算子收到Barrier后做State快照保存到HDFS。故障恢复时从最近的Checkpoint恢复State和Kafka offset。

关键细节:Barrier对齐——多个上游的Barrier要等齐了才做快照。如果某个上游慢,下游被卡住。Flink 1.11引入了非对齐Checkpoint解决这个问题。

生产必须用增量Checkpoint。我们State 20GB,全量Checkpoint每次90秒,增量只需15秒。RocksDB+增量Checkpoint是标配。

Checkpoint vs Savepoint:Checkpoint自动触发用于容错,Savepoint手动触发用于版本升级。每次上线前先打Savepoint,有Bug能回滚。

刷题进度保存在当前浏览器