Checkpoint与容错:任务挂了数据不丢的秘密
Checkpoint · Savepoint · Barrier对齐 · 增量Checkpoint
📋 面试题
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能回滚。