首页/数据/数据工程与 ETL 速查/流任务 Checkpoint 与状态恢复
管道基础52 条

流任务 Checkpoint 与状态恢复

Checkpoint 定期把算子状态与消费位点做成一致性快照存到外部存储,作业故障后从最近一次成功快照恢复,避免从头重放。

Checkpoint 是什么

Checkpoint(检查点)是流任务定期制作的一致性快照:把各算子的状态与消费位点一起存到外部共享存储,作业故障重启后从最近一次成功的快照恢复,把位点与状态一起倒退回那一刻,从而得到一致的结果。

与恢复时间的关系

恢复时间取决于快照体积与恢复带宽:状态越大,写快照越慢、恢复越久。所以 checkpoint 的持续变大是一个需要治理的信号,通常意味着 key 基数增长、窗口过长或去重状态没有设置过期。它和 Savepoint 的区别是:checkpoint 由系统自动管理并会清理,savepoint 由人工触发并长期保留。

基本信息

作用状态与位点的一致性快照,故障恢复的基础
存储HDFS、S3、OSS 等可共享存储,不能放单机本地盘
触发按时间间隔自动触发,也可手动触发
与精确一次需要 checkpoint 与事务型 sink 或幂等 sink 共同实现
与 Savepointcheckpoint 自动管理、可清理;savepoint 人工触发、长期保留

典型使用场景

  • 流作业长期运行:靠 checkpoint 实现故障后从断点恢复,而不是从最早重放
  • 版本升级前:先打 savepoint,再按新版本从该点恢复
  • 状态膨胀治理:通过快照体积与恢复耗时曲线判断是否需要给状态设 TTL
  • 精确一次链路:checkpoint 与支持两阶段提交的 sink 配合才成立
  • 扩缩容:从快照恢复时会按新并行度重新分配状态

Flink 配置 checkpoint(SQL 作业)

Flink 配置 checkpoint(SQL 作业)
-- 在作业启动前设置:间隔、模式、存储目录与超时
SET 'execution.checkpointing.interval' = '60s';        -- 每 60 秒触发一次
SET 'execution.checkpointing.mode' = 'EXACTLY_ONCE';   -- 一致性模式
SET 'state.checkpoints.dir' = 'hdfs:///flink/checkpoints';
SET 'execution.checkpointing.timeout' = '10min';       -- 单次快照超时
SET 'execution.checkpointing.min-pause' = '30s';       -- 两次快照间的最小间隔

Flink 配置 checkpoint(DataStream API)

Flink 配置 checkpoint(DataStream API)
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(60_000);                       // 每 60 秒一次
env.getCheckpointConfig().setCheckpointTimeout(10 * 60_000);      // 单次快照超时
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30_000);  // 避免快照连续触发
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);         // 同时只允许一个快照

关键参数读法

参数含义取值建议
interval两次快照的间隔按可接受的重放量定,常为 1 到 5 分钟
timeout单次快照超时时间要大于状态最大时的写入耗时
min-pause两次快照之间的最小间隔防止快照连续触发吃满 IO
存储目录快照落盘位置必须是共享存储,单机盘无法支撑故障恢复
重启策略失败后的重试方式设置最大重试次数,避免无限重试掩盖故障
checkpoint 存在单机本地磁盘是常见部署错误:节点宕机后快照随磁盘一起丢失,作业只能从头重放,恢复时间与数据重复量都不可控。
重启策略设为无限重试会让作业在故障中反复自愈又反复失败,看起来「一直在跑」,实际数据早已滞后。配合告警与最大重试次数,才能让故障暴露出来。

易错点

  • checkpoint 落在本地磁盘而非共享存储,节点故障后无法恢复,只能从头重放
  • 无限重启策略掩盖真实故障,作业反复重启但不报警,数据滞后数小时才被发现
  • checkpoint 间隔过短导致快照连续触发、IO 被占满,反而拖慢正常处理
  • 状态持续膨胀不治理(key 基数增长、窗口过长、去重状态无 TTL),恢复时间一轮比一轮长

数据来源与参考

  • Apache Flink 官方文档:Checkpointing
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌