Flink检查点(checkpoint)、 保存点(savepoint)的区别和联系

本文详细介绍了Flink的检查点(checkpoint)和保存点(savepoint)的区别和联系。检查点用于实现容错,周期性生成状态快照,允许在故障后恢复。保存点则是自包含的全量状态快照,适用于作业升级、迁移等场景。两者都是基于Flink的Checkpoint机制,但savepoint更侧重于作业维护的灵活性和可移植性,支持并行度改变和代码升级后的恢复。此外,文章还讨论了如何配置和使用这两者。

一、Flink checkpoint

Checkpoint是Flink实现容错机制最核心的功能,能够根据配置周期性的基于Stream中各个Operator的状态来生成Snapshot,从而将这些状态数据定期持久存储下来,当Flink程序一旦意外崩溃时,重新运行程序时可以有选择的从这些Snapshot进行恢复,从而修正因为故障带来的程序数据状态中断。

1、Checkpoint指定触发生成时间间隔后,每当需要触发Checkpoint时,会向Flink程序运行时的多个分布式Stream Source中插入一个Barrier标记。

2、当一个Operator接收到一个Barrier时,它会暂停处理Steam中新接收到的数据记录

3、每个Stream中都会存在对应的Barrier,该Operator要等到所有的输入Stream中的Barrier都到达。当所有Stream中的Barrier都已经到达该Operator,这时所有的Barrier在时间上看来是同一个时刻点(表示已经对齐)

4、该Operator会将数据记录(Outgoing Records)发射(Emit)出去,作为下游Operator的输入

5、最后将Barrier对应Snapshot发射(Emit)出去作为此次Checkpoint的结果数据

开启checkpoint

val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStateBackend(new FsStateBackend("hdfs://ip:8020/flink/flink-checkpoints"))
val config = env.getCheckpointConfig
    config.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION)
config.setCheckpointingMode(Ch

在 Apache Flink 的 DataStream API 中,状态(State)、检查点Checkpoint保存点Savepoint)是实现流处理应用容错性可维护性的核心机制。它们各自有不同的工作原理使用场景。 ### 状态管理(State) Flink 提供了多种状态类型,用于在流处理过程中存储更新中间结果。常见的状态包括 `ValueState`、`ListState` `MapState` 等。这些状态通常与算子(Operator)绑定,并随着数据流的处理而不断更新。 例如,在一个简单的计数器场景中,可以使用 `ValueState` 来记录累计值: ```java public class CounterFunction extends RichFlatMapFunction<Long, Long> { private transient ValueState<Long> counterState; @Override public void open(Configuration parameters) throws Exception { StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.seconds(10)) .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite) .build(); ValueStateDescriptor<Long> descriptor = new ValueStateDescriptor<>("counter", Long.class); descriptor.enableTimeToLive(ttlConfig); counterState = getRuntimeContext().getState(descriptor); } @Override public void flatMap(Long input, Collector<Long> out) throws Exception { Long currentCount = counterState.value(); if (currentCount == null) { currentCount = 0L; } currentCount += input; counterState.update(currentCount); out.collect(currentCount); } } ``` 上述代码展示了如何使用 `ValueState` 来维护一个计数器的状态。此外,Flink 还支持 `ListState` `MapState`,分别用于存储列表键值对集合。 ### 检查点机制(CheckpointFlink检查点机制是一种自动触发的容错机制,它通过定期将任务的状态写入持久化存储来确保在发生故障时能够恢复到最近的一致性状态。检查点的核心思想是利用分布式快照技术,捕获整个作业的所有任务的状态快照[^4]。 为了启用检查点,可以在 `StreamExecutionEnvironment` 中进行如下配置: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(5000); // 设置检查点间隔时间为5秒 // 可选:设置最小时间间隔以避免频繁触发检查点 env.getCheckpointConfig().setMinPauseBetweenCheckpoints(2000); // 启用本地状态恢复以加快恢复速度 env.getCheckpointConfig().enableLocalRecovery(); // 设置检查点存储路径 env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("hdfs://node01:9000/flink/checkpoints")); ``` 检查点的主要作用是在作业意外失败时提供快速恢复的能力,确保作业能够在不丢失数据的情况下继续执行。对于需要高可用性的实时处理任务来说,检查点是非常关键的功能[^1]。 ### 保存点Savepoint保存点是一种手动触发的状态快照机制,主要用于计划内的操作,如作业升级、迁移或调试。与检查点不同的是,保存点不会被系统自动删除,而是由用户显式地创建管理。 要创建一个保存点,可以通过命令行工具或者编程方式调用相关接口: ```bash flink savepoint <jobId> hdfs://node01:9000/flink/savepoints ``` 保存点的工作原理类似于检查点,但它更侧重于人为干预下的状态管理。例如,在部署新版本的应用程序之前,可以先生成一个保存点;如果新版本存在问题,则可以从该保存点恢复旧版本的状态[^3]。 ### 差异对比 | 特性 | Checkpoint | Savepoint | |----------------|-----------------------------------------|------------------------------------------| | 触发方式 | 自动触发 | 手动触发 | | 使用目的 | 容错(应对意外崩溃) | 维护(如升级、迁移) | | 生命周期 | 根据配置保留一定数量 | 长期保留,除非用户显式删除 | | 存储位置 | 分布式文件系统 | 分布式文件系统 | | 恢复效率 | 快速恢复 | 恢复效率取决于具体实现 | 总结而言,状态管理提供了流处理过程中必要的内存结构支持,检查点保障了系统的可靠性连续性,而保存点则为应用程序提供了灵活的状态控制手段。根据实际需求选择合适的状态管理容错策略,可以显著提高 Flink 应用程序的健壮性灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值