Flink Checkpoint与Savepoint的区别
请比较Flink中Checkpoint和Savepoint的区别,以及它们各自的使用场景。
回答
屠龙少年
Checkpoint定义: Flink自动触发的分布式快照,用于故障恢复,保证Exactly-Once语义。
Savepoint定义: 用户手动触发的状态快照,用于应用升级、运维操作。
详细对比:
| 维度 | Checkpoint | Savepoint |
|---|---|---|
| 触发方式 | 自动(周期性) | 手动(用户触发) |
| 目的 | 故障恢复(容错) | 运维操作(升级/迁移/修复) |
| 生命周期 | 作业停止后自动清理 | 手动保留,停止后不删除 |
| 状态格式 | 同Savepoint格式(优化) | 标准格式,跨版本兼容 |
| 存储位置 | 配置的状态后端(checkpoint目录) | 用户指定的路径 |
| 是否过期 | 根据配置自动覆盖旧Checkpoint | 永久保留 |
| 恢复灵活性 | 只能恢复到Checkpoint的精确时间点 | 可恢复到任意Savepoint |
| 性能开销 | 小(增量/异步) | 小 |
Checkpoint工作机制:
- JobManager向Source Operator注入Barrier(检查点标记)
- Barrier在算子间传递,触发状态快照
- 采用Chandy-Lamport算法的变体(异步Barrier对齐)
- 所有Operator完成快照后Checkpoint完成
配置:
// Checkpoint
env.enableCheckpointing(10000); // 每10秒一次
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(5000);
// Savepoint
// flink savepoint <jobId> <savepointPath>
// flink run -s <savepointPath> -c MainClass application.jar
Savepoint典型应用场景:
- 应用升级: 修改业务逻辑后从Savepoint恢复
- Flink版本升级: 跨Flink版本迁移
- 并行度调整: 调整并行度后恢复
- Bug修复: 从Savepoint重新处理矫正数据
- A/B测试: 克隆线上状态到测试环境