Flink中StateBackend(工作状态)与Checkpoint(状态快照)的关系

本文详细介绍了Flink中的StateBackends,包括keyed和非keyed状态管理,RocksDB和Heap状态存储的优缺点,以及Checkpoint机制。重点讨论了不同版本的Flink中StateBackend与CheckpointStorage的关系,以及如何配置和启用检查点功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

State Backends

由 Flink 管理的 keyed state 是一种分片的键/值存储,每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。另外,Operator state 也保存在机器节点本地。Flink 定期获取所有状态的快照,并将这些快照复制到持久化的位置,例如分布式文件系统。

如果发生故障,Flink 可以恢复应用程序的完整状态并继续处理,就如同没有出现过异常。

Flink 管理的状态存储在 state backend 中。Flink 有两种 state backend 的实现:

  • 一种基于 RocksDB 内嵌 key/value 存储将其工作状态保存在磁盘上的,将其状态快照持久化到(分布式)文件系统;
  • 另一种基于堆的 state backend,将其工作状态保存在 Java 的堆内存中。这种基于堆的 state backend 有两种类型:
    • FsStateBackend,将其状态快照持久化到(分布式)文件系统;
    • MemoryStateBackend,它使用 JobManager 的堆保存状态快照。

在这里插入图片描述

当使用基于堆的 state backend 保存状态时,访问和更新涉及在堆上读写对象。但是对于保存在 RocksDBStateBackend 中的对象,访问和更新涉及序列化和反序列化,所以会有更大的开销。但 RocksDB 的状态量仅受本地磁盘大小的限制。还要注意,只有 RocksDBStateBackend 能够进行增量快照,这对于具有大量变化缓慢状态的应用程序来说是大有裨益的。

所有这些 state backends 都能够异步执行快照,这意味着它们可以在不妨碍正在进行的流处理的情况下执行快照。

Checkpoint

Flink 定期对每个算子的所有状态进行持久化快照,并将这些快照复制到更持久的地方,例如分布式文件系统。 如果发生故障,Flink 可以恢复应用程序的完整状态并恢复处理,就好像没有出现任何问题一样。

这些快照的存储位置是通过作业_checkpoint storage_定义的。 有两种可用检查点存储实现:一种持久保存其状态快照 到一个分布式文件系统,另一种是使用 JobManager 的堆。

在这里插入图片描述

Flink不同版本StateBackend(状态)与Checkpoint Storage(快照) 关系

在Flink1.14之前StateBackend与Checkpoint Storage 耦合在一起,但在Flink1.14之后把StateBackend与Checkpoint Storage 实现了解耦,使逻辑更加清晰。

Flink1.14之前

  • 基于 RocksDB state backend,状态快照持久化到(分布式)文件系统;
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new RocksDBStateBackend("hdfs://namenode:8020/data/rocksdb/ck", true));//true: 增量checkpoint; false:全量checkpoint
env.setStateBack
### 查找Flink Checkpoint机制的源码 在Apache Flink框架中,Checkpoint机制是实现容错的关键特性之一。为了理解这一机制的工作原理并找到对应的源代码位置,可以从以下几个方面入手: #### 1. Checkpoint协调器 (Checkpoint Coordinator) Checkpoint协调器负责触发和管理整个集群中的Checkpoints操作。这部分逻辑主要位于`org.apache.flink.runtime.checkpoint.CheckpointCoordinator`类中[^1]。 ```java public class CheckpointCoordinator { // 负责启动新的检查点过程 public void triggerCheckpoint( long checkpointId, long timestamp) throws Exception { ... } } ``` 此部分实现了如何创建一个新的检查点ID以及通知各个TaskManager来保存状态等功能。 #### 2. Task级别的Checkpoint处理 对于每一个具体的任务(Task),当收到由JobManager发出的通知时,则会在本地执行实际的状态持久化工作。这通常是在继承自`AbstractInvokable`的任务基类里完成的,在子类如SourceFunction、MapFunction等也会有相应的重写方法来进行具体业务逻辑的数据快照保存。 ```java abstract class AbstractInvokable implements Runnable { @Override public final void run() { try { while (!isCanceled()) { invoke(); // 执行周期性的checkpoint动作 if (checkpointEnabled && canTriggerCheckpoint()) { performCheckpoint(checkpointId); } } } catch (...) {} } protected abstract void invoke() throws Exception; private boolean canTriggerCheckpoint(){...}; private void performCheckpoint(long checkpointId){...}; } ``` 这段伪代码展示了任务运行过程中定期调用performCheckpoint函数以响应来自外部调度程序发起的一致性快照请求的过程。 #### 3. State Backend接口定义 StateBackend决定了应用程序状态的具体存储方式(内存/文件系统)。其核心接口定义如下所示: ```java @PublicEvolving public interface StateBackend extends java.io.Serializable { OperatorStateBackend createOperatorStateBackend( ExecutionConfig executionConfig, String operatorIdentifier) throws IOException; KeyedStateBackend<?> createKeyedStateBackend( Environment environment, JobID jobID, String operatorName, TypeSerializer<?> keySerializer, int numberOfParallelSubtasks, int ownSubtaskIndex) throws IOException; } ``` 通过不同的实现可以选择适合的应用场景下的高效存取策略。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值