在 Apache Flink 中,Savepoints 和 Checkpoints 是两种用于状态管理和恢复的重要机制。虽然它们在功能上有相似之处,但它们的设计目的和使用场景有所不同。
Checkpoints(检查点)
Checkpoints 是 Flink 中用于实现容错和状态恢复的基本机制。通过定期创建检查点,Flink 可以在发生故障时恢复到最近的检查点状态,从而确保 Exactly-Once 或者 At-Least-Once 语义。
Checkpoints 的特点:
- 周期性:Checkpoints 是周期性地创建的,用户可以配置检查点的间隔时间。
- 自动触发:由 Flink 的 JobManager 自动触发,无需手动干预。
- 一致性:通过屏障(Barrier)同步各个操作符实例,确保所有操作符在相同的时刻进行状态快照,从而保持一致性。
- 恢复机制:当发生故障时,Flink 可以从最近的检查点恢复状态,继续处理数据流。
- 状态管理:Checkpoints 保存的是当前操作符的状态,可以存储在持久化的存储系统中,如 HDFS 或其他支持 Hadoop 文件系统的存储。
Savepoints(保存点)
Savepoints 是一种特殊类型的检查点,它主要用于应用程序的升级迁移和状态转移。Savepoints 保留了应用程序的状态,但与 Checkpoints 相比,它们具有更高的灵活性和更广泛的用途。
Savepoints 的特点:
- 手动触发:Savepoints 通常由用户手动触发,而不是自动创建的。
- 状态兼容性:Savepoints 可以用于在应用程序版本升级时保留状态。即使应用程序的结构或配置发生了变化,只要状态兼容,就可以从 Savepoint 恢复状态。
- 状态转移:Savepoints 可以用于将状态从一个应用程序转移到另一个应用程序。只要目标应用程序能够读取 Savepoint 中的状态,就可以继续处理数据流。
- 跨版本恢复:Savepoints 支持跨版本恢复,即可以将旧版本应用程序的状态恢复到新版本的应用程序中。
- 持久存储:Savepoints 通常存储在持久化的存储系统中,可以长期保存以备将来使用。
区别总结
- 触发方式:- Checkpoints 是自动触发的,用户可以配置触发频率。- Savepoints 是手动触发的,用户根据需要决定何时创建 Savepoint。
- 用途:- Checkpoints 用于实现应用程序的容错,确保在发生故障时可以从最近的检查点恢复状态。- Savepoints 用于应用程序的版本迁移和状态转移,可以跨版本恢复状态。
- 状态兼容性:- Checkpoints 通常用于相同版本的应用程序恢复。- Savepoints 支持跨版本恢复,只要状态兼容即可。
- 存储位置:- Checkpoints 和 Savepoints 都可以存储在持久化的存储系统中,但 Savepoints 通常用于长期保存,以便将来使用。
示例
以下是一个简单的示例,展示了如何在 Flink 中创建 Checkpoint 和 Savepoint:
创建 Checkpoint
env.enableCheckpointing(5000);// 设置检查点间隔为 5 秒
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
这段代码设置了检查点间隔为 5 秒,并且启用了 Exactly-Once 语义。此外,还启用了外部化检查点(externalized checkpoints),这意味着即使 JobManager 失败,检查点也不会丢失。
创建 Savepoint
String savepointPath ="hdfs://localhost:9000/path/to/savepoint";
env.executeAndCollect(savepointPath);
这段代码创建了一个 Savepoint,并将其保存到指定的 HDFS 路径中。
总结
Checkpoints 和 Savepoints 都是 Flink 中用于状态管理和恢复的重要机制,但它们的设计目的和使用场景有所不同。Checkpoints 用于实现容错,确保在发生故障时可以从最近的检查点恢复状态;而 Savepoints 用于应用程序的版本迁移和状态转移,支持跨版本恢复状态。理解这两种机制的区别有助于更好地设计和实现 Flink 应用程序。
版权归原作者 用心去追梦 所有, 如有侵权,请联系我们删除。