Day 11-15:Checkpoint & Savepoint & 大状态调优
目标:能独立配置一个稳定的生产任务。
1. Checkpoint 是什么
Checkpoint = Flink 定期把所有算子的状态快照持久化,用于故障恢复。
作用:任务 Failover 后从最新 CK 恢复,保证 Exactly-once 语义。
2. Checkpoint 执行原理:两阶段提交
Flink CK 采用 Chandy-Lamport 算法(Barrier 机制):
Step 1:JobManager 触发 CK,向 Source 发送 Barrier
Source(Kafka)
↓ 正常数据 ... [Barrier n] ... 正常数据
当 Source 收到 Barrier 指令时,记录当前 Kafka offset,并向下游发送 Barrier
Step 2:Barrier 在 DataStream 中流动
Source → [data, data, Barrier] → Map → [data, data, Barrier] → Sink
每个算子收到 Barrier 后:
- 暂停处理 Barrier 之后的数据
- 将当前状态写入 State Backend(内存 or RocksDB)
- 通知 JobManager 本算子 CK 完成
- 继续处理后续数据
Step 3:JobManager 收到所有算子 CK 完成通知
→ 标记本次 CK 成功 → 通知 Kafka Source 提交 offset(精准一次!)
3. Exactly-once 精准一次
Flink 的 Exactly-once 分两层:
| 层级 | 说明 |
|---|---|
| Flink 内部 | 通过 CK 保证,状态只更新一次 |
| 端到端(E2E) | 需要 Source 可重放(Kafka)+ Sink 支持两阶段提交或幂等写入 |
端到端 Exactly-once 需要的条件:
- Source:支持重放(Kafka 可以重设 offset)
- Sink:支持两阶段提交(如 Flink Kafka Producer)或幂等写入(如 ClickHouse 主键去重)
- CK 成功后才提交 Sink 的数据
4. CK 配置(生产推荐)
CheckpointConfig ckConfig = env.getCheckpointConfig();
// 启用 CK,间隔 1 分钟
env.enableCheckpointing(60_000L);
// 语义:精准一次(默认),如果接受 at-least-once 可以更快
ckConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/huangrunxing/article/details/158690077



