首页/数据/数仓建模速查/Checkpoint 与端到端一致性
湖仓与引擎63 条

Checkpoint 与端到端一致性

Checkpoint 周期性快照算子状态,配合两阶段提交 sink 可实现端到端精确一次;间隔越小恢复越快但运行时开销越大。

数仓建模速查数据更新于 2026-10-13

Checkpoint 是什么

Checkpoint 是 Flink 周期性给算子状态做的分布式快照:作业在数据流里插入屏障,各算子把状态写入持久化存储,全部完成后这个检查点才算成功。作业失败重启时,从最近一次成功的检查点恢复状态与消费位点,从而不丢状态、不重算已确认的数据。它只保证作业内部的容错,要做到端到端精确一次,还需要源头可重放并且 sink 支持事务或幂等写入。

基本信息

一致性语义execution.checkpointing.mode,可取 EXACTLY_ONCE 或 AT_LEAST_ONCE
触发间隔execution.checkpointing.interval
超时设置execution.checkpointing.timeout
最短间隔execution.checkpointing.min-pause,避免检查点连拍
状态后端state.backend(新版本为 state.backend.type),hashmap 或 rocksdb
增量检查点state.backend.incremental,大状态作业建议开启
存放位置state.checkpoints.dir,通常是 HDFS 或对象存储
外部化保留externalized-checkpoint-retention 决定作业取消后是否保留

典型使用场景

  • 任何有状态的流作业(窗口聚合、双流 join、维表关联)都必须开启检查点,否则重启后状态归零
  • 端到端精确一次:检查点配合 Kafka 事务生产者或湖表的两阶段提交 sink
  • 大状态作业:用 RocksDB 状态后端加增量检查点,降低每次快照的写入量
  • 版本升级或调整并行度:从保留的检查点或 savepoint 恢复,避免重跑全量数据
  • 对恢复时间有硬要求:缩短检查点间隔,用更高的运行时开销换取更快的恢复

flink-conf.yaml 关键配置

flink-conf.yaml 关键配置
# 检查点基础设置
execution.checkpointing.interval: 60s            # 触发间隔,按可接受的恢复时间设定
execution.checkpointing.mode: EXACTLY_ONCE       # 精确一次语义
execution.checkpointing.timeout: 10min           # 单次检查点超时,大状态要留足
execution.checkpointing.min-pause: 30s           # 两次检查点之间最短间隔,避免连拍

# 作业取消后保留检查点,便于排查与恢复
execution.checkpointing.externalized-checkpoint-retention: RETAIN_ON_CANCELLATION

# 状态后端与存放位置
state.backend.type: rocksdb                      # 大状态用 rocksdb,小状态可用 hashmap
state.backend.incremental: true                  # 增量检查点,降低快照写入量
state.checkpoints.dir: hdfs:///flink/checkpoints  # 建议纳入容量监控

关键配置逐项读法

配置项含义取值思路
checkpointing.interval两次检查点之间的间隔按可接受的恢复时长设定
checkpointing.mode一致性语义有精确一次需求选 EXACTLY_ONCE
checkpointing.timeout单次检查点超时时间大状态要留足写入时间
checkpointing.min-pause两次检查点最短间隔防止连拍挤压正常处理
state.backend.type状态后端类型大状态用 rocksdb
state.checkpoints.dir检查点存放路径HDFS 或对象存储,纳入监控
检查点目录要配容量监控与保留策略。历史检查点长期不清会持续占用存储,也会让恢复时的候选列表变长,运维上得不偿失。
检查点频繁超时如果被忽略,作业表面上仍在稳定消费,一旦发生故障只能从更早的状态恢复,对外表现为数据重复或部分丢失,且很难事后区分。

易错点

  • 检查点频繁超时无人处理:故障恢复点远早于预期,下游出现重复或缺失数据
  • 检查点间隔设得过短:快照连拍挤压正常处理,作业吞吐下降甚至反压
  • 大状态作业仍用内存状态后端:检查点写入与恢复过程都不稳定
  • sink 不支持事务却期待端到端精确一次:重启后重复数据写入下游
  • 未开启外部化检查点保留:作业取消后状态被清理,无法从原进度恢复

数据来源与参考

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