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 决定状态规模和性能边界。

参考链接