Flink 的状态管理、Checkpoint 与 Savepoint
Flink 的可靠性建立在状态快照之上,Checkpoint 用于故障恢复,Savepoint 用于升级、迁移和人工控制。
Flink 的状态管理、Checkpoint 与 Savepoint
Flink 之所以适合实时计算,很大一部分原因是它把状态作为一等公民。
没有状态,只能做简单 map/filter。有了状态,才能做去重、窗口、会话、累计指标、实时风控和复杂事件处理。
Rendering diagram...
Keyed State
Keyed State 绑定在 key 上。比如按用户累计消费金额,每个 user_id 都有自己的状态。
ValueState<Long> countState = getRuntimeContext().getState(
new ValueStateDescriptor<>("count", Long.class)
);
Keyed State 是 Flink 有状态计算里最常见的状态类型。
Operator State
Operator State 绑定在算子实例上,不按 key 划分。Kafka Source 记录分区 offset,就可以使用类似 Operator State 的思想。
Checkpoint
Checkpoint 是 Flink 自动触发的状态快照。作业失败后,Flink 可以从最近一次成功 Checkpoint 恢复。
Checkpoint 依赖分布式快照机制。Barrier 会在数据流中传播,用来协调不同算子的状态快照。
Savepoint
Savepoint 是人为触发的状态快照,常用于:
- 作业升级。
- 修改并行度。
- 迁移集群。
- 版本发布前留回滚点。
Checkpoint 偏自动容错,Savepoint 偏运维控制。
State Backend
状态可以放在内存,也可以放在 RocksDB 等后端。状态很大时,RocksDB State Backend 更常见,但读写会有序列化和本地存储开销。
小结
Flink 的状态管理决定了实时作业的可靠性和可维护性。Checkpoint 让失败可恢复,Savepoint 让升级可控,State Backend 决定状态规模和性能边界。