告别混淆!一文讲透 Flink State Backend 与 Checkpoint Storage

发布时间:2026/5/21 18:59:20

告别混淆!一文讲透 Flink State Backend 与 Checkpoint Storage 一、引言在 Flink 1.13 版本之前StateBackend接口是一个“大杂烩”它同时负责两件事状态的本地访问与存储Task 运行时状态存在哪内存还是 RocksDBCheckpoint 数据的持久化做快照时状态备份到哪JobManager 还是 HDFS这种设计导致了概念上的混淆例如FsStateBackend运行时其实使用的是 TaskManager 的堆内存但名字却带有 Fs。为了让职责更清晰Flink 1.13 正式将这两者解耦。概念职责类比State Backend管理运行时状态的存储与访问方式相当于内存/磁盘——决定你在工作时把数据放在哪里Checkpoint Storage管理检查点快照的持久化存储位置相当于备份仓库——决定你把备份数据存到哪里二、State BackendState Backend 决定了运行时状态数据的存储介质和访问方式目前主推两种 State Backend。1.HashMapStateBackend状态以 Java 对象形式直接存储在 TaskManager 的 JVM 堆内存中读写速度最快直接内存访问无序列化/反序列化开销状态大小受限于 JVM 堆内存容量不支持增量 Checkpoint每次 Checkpoint 需要全量序列化整个状态2.EmbeddedRocksDBStateBackend状态存储在 TaskManager 本地磁盘上的嵌入式 RocksDB 实例中读写涉及序列化/反序列化Java 对象 ↔ byte[]有一定性能开销状态大小仅受限于本地磁盘容量可以管理超大规模状态TB 级别支持增量 Checkpoint基于 RocksDB SST 文件的增量上传RocksDB 的 Block Cache 和 Write Buffer 会占用 堆外内存Off-Heap3.两种StateBackend对比维度HashMapStateBackendEmbeddedRocksDBStateBackend存储介质JVM 堆内存本地磁盘RocksDB访问速度⚡ 极快直接内存访问 较慢涉及序列化 磁盘I/O状态规模上限受限于堆内存通常 GB 级受限于磁盘可达 TB 级增量 Checkpoint❌ 不支持✅ 支持内存管理JVM GC 管理Flink Managed Memory 管理典型吞吐量影响对吞吐量影响小约降低 30%~50%取决于状态访问频率适用场景小状态、高吞吐大状态、超大 Key 数量三、Checkpoint StorageCheckpoint Storage 决定了Checkpoint 快照数据的持久化位置目前主推两种 Checkpoint Storage。1.JobManagerCheckpointStorageCheckpoint 数据通过 RPC 发送至 JobManager存储在其堆内存中每个独立状态的大小上限默认为 5 MB可配置MAX_STATE_SIZE仅适用于本地开发/测试生产环境绝不应使用作业失败时如果 JobManager 也崩溃Checkpoint 数据丢失2.FileSystemCheckpointStorageCheckpoint 数据写入分布式文件系统具备高可用性和持久性小状态默认阈值 20KB仍会内联存储在_metadata文件中避免创建过多小文件生产环境唯一推荐的 Checkpoint Storage支持与 EmbeddedRocksDBStateBackend 配合实现增量 Checkpoint3.Checkpoint完整流程步骤说明涉及组件①CheckpointCoordinator 按配置的间隔周期性触发JobManager②Checkpoint Barrier 作为特殊事件插入数据流Source → 下游③多输入算子等待所有 Channel 的 Barrier 到齐对齐模式Operator④同步阶段创建状态快照的引用非常快通常 ms 级State Backend⑤异步阶段将状态数据写入持久化存储可能耗时较长Checkpoint Storage⑥TaskManager 向 JobManager 报告该算子的 Checkpoint 完成TM → JM⑦所有算子 Ack 后Checkpoint 被标记为完成JobManager四、State Backend与Checkpoint Storage关系旧版 ( 1.13已废弃)等价的新版组合 (≥ 1.13)MemoryStateBackendHashMapStateBackend JobManagerCheckpointStorageFsStateBackendHashMapStateBackend FileSystemCheckpointStorageRocksDBStateBackendEmbeddedRocksDBStateBackend FileSystemCheckpointStorage在Flink现在新版本的使用中两者结合的组合矩阵建议如下组合State BackendCheckpoint Storage适用性AHashMapStateBackendJobManagerCheckpointStorage⚠️ 仅开发/测试BHashMapStateBackendFileSystemCheckpointStorage✅ 生产推荐中小状态CEmbeddedRocksDBStateBackendJobManagerCheckpointStorage❌ 不推荐无实际意义DEmbeddedRocksDBStateBackendFileSystemCheckpointStorage✅ 生产推荐大状态以下是大多数生产环境下的推荐配置适用于大状态、高可用场景# State Backend state.backend: rocksdb state.backend.incremental: true state.backend.rocksdb.localdir: /data1/flink/rocksdb,/data2/flink/rocksdb state.backend.rocksdb.memory.managed: true state.backend.rocksdb.predefined-options: FLASH_SSD_OPTIMIZED # Checkpoint Storage state.checkpoint-storage: filesystem state.checkpoints.dir: hdfs:///flink/checkpoints state.savepoints.dir: hdfs:///flink/savepoints # Checkpoint 行为 execution.checkpointing.interval: 2min execution.checkpointing.mode: EXACTLY_ONCE execution.checkpointing.timeout: 10min execution.checkpointing.min-pause: 1min execution.checkpointing.max-concurrent-checkpoints: 1 # 保留策略 state.checkpoints.num-retained: 3 # 内存配置 taskmanager.memory.managed.fraction: 0.4

相关新闻