Savepoint:作业升级与状态迁移
Savepoint 是手工触发的一致性状态快照,用途是作业升级与迁移:调整并行度、修改逻辑、更换集群之前先停机打点,再从保存点启动新版本,状态被映射到新的拓扑结构上。与之相对,checkpoint 是自动周期性触发的故障恢复机制,不承担版本管理职责。
基本信息
| 触发方式 | 手动 |
|---|---|
| 典型用途 | 版本升级、迁移、并行度调整 |
| 恢复方式 | 从保存点路径启动新作业 |
| 关键约束 | 算子 UID 必须稳定 |
| 区别于 | checkpoint 面向故障自动恢复 |
典型使用场景
- 版本升级:停机打点、部署新 jar、从保存点恢复
- 并行度调整:扩容或缩容后,从保存点恢复作业状态
- 逻辑变更:确认改动不影响状态映射关系后再恢复
- 灰度与回滚:保留保存点作为回滚基线
- 停机维护:用 stop 带保存点的方式优雅停止作业
Savepoint 操作
Savepoint 操作
# 触发保存点(作业运行时也可执行)
flink savepoint <jobId> hdfs:///flink/savepoints
# 优雅停止并同时生成保存点
flink stop --savepointPath hdfs:///flink/savepoints <jobId>
# 从保存点恢复启动新版本作业
flink run -s hdfs:///flink/savepoints/savepoint-<id> -d new-job.jar
# 恢复前先确认保存点目录完整、元数据可读,避免停机窗口被拉长Savepoint 与 Checkpoint
| 项目 | Savepoint | Checkpoint |
|---|---|---|
| 触发 | 手动 | 自动周期 |
| 主要用途 | 版本升级与迁移 | 故障自动恢复 |
| 保留 | 长期保留 | 按策略保留最近几次 |
| 状态映射 | 依赖算子 UID | 同样依赖 UID |
算子如果不指定稳定的 uid,调整逻辑后状态无法映射到新算子,恢复会失败或状态被丢弃,只能从零开始重放历史数据。
保存点的兼容性取决于状态结构与 uid 是否稳定:改变算子顺序、增删带状态的算子都要提前评估,并在测试环境先做一次恢复演练。
允许跳过无法映射的状态(allowNonRestoredState)是应急手段,不是常规做法:它能快速让作业起来,但被丢弃的状态对应的业务数据会静默变成空白。