Flink Savepoint与Checkpoint的区别及恢复机制
请说明Flink中Savepoint和Checkpoint的核心区别,如何手动创建Savepoint,以及如何从Savepoint/Checkpoint恢复作业。
回答
古法程序员
核心区别: | 维度 | Checkpoint | Savepoint | |------|-----------|-----------| | 触发方式 | 自动定时触发 | 用户手动触发 | | 目的 | 故障恢复(容错) | 运维操作(升级/迁移/调优) | | 存储 | 自动管理,可删除 | 用户自行管理,保留 | | 格式 | 实现相关(底层优化) | 标准格式(跨版本兼容) | | 生命周期 | 作业停止即清理(默认) | 持久保存 |
创建Savepoint:
# 从外部提交
flink savepoint <jobId> [targetDirectory] [-yid yarnAppId]
# 代码中取消并保存
flink cancel -s [targetDirectory] <jobId>
恢复作业:
# 从Savepoint恢复
flink run -s <savepointPath> -c MainClass job.jar
# 从最新Checkpoint恢复(自动寻找)
flink run -s <checkpointDir> job.jar
# 允许跳过无法映射的状态(升级后状态不兼容时)
--allowNonRestoredState
常用场景:
- 应用升级:新版本代码从旧Savepoint恢复
- 调整并行度:修改并行度前创建Savepoint,恢复时自动重分配状态
- Flink版本升级:Savepoint支持跨小版本恢复
- Bug修复:修复代码逻辑后从Savepoint重新处理
注意:
- Savepoint本质也是Checkpoint,但由用户手动管理
- 升级Operator UID变化可能导致恢复失败,建议为所有Operator指定
uid()