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 或对象存储,纳入监控 |
检查点目录要配容量监控与保留策略。历史检查点长期不清会持续占用存储,也会让恢复时的候选列表变长,运维上得不偿失。
检查点频繁超时如果被忽略,作业表面上仍在稳定消费,一旦发生故障只能从更早的状态恢复,对外表现为数据重复或部分丢失,且很难事后区分。