本博客是笔者在生产环境使用 Flink 遇到的 Checkpoint 相关故障后,整理输出,价值较高的 实战采坑记,本文会带你更深入的了解 Flink 实现增量 Checkpoint 的细节。
通过本文,你能 get 到以下知识:
- Flink Checkpoint 目录的清除策略
- 生产环境应该选择哪种清除策略
- 生产环境必须定期脚本清理 Checkpoint 和 Savepoint 目录
- RocksDB 增量 Checkpoint 实现原理
- 如何合理地删除 Checkpoint 目录?
- 通过解析 Flink Checkpoint 的元数据信息来合理清理 Checkpoint 信息
1. 故障背景
本次故障涉及到的知识面比较多,将从以下多个角度来详细描述。
1.1 Flink Checkpoint 目录的清除策略
如下图所示,红圈处的一行配置 env.getCheckpointConfig().enableExternalizedCheckpoints() 表示当 Flink 任务取消时,是否保留外部保存的 CheckPoint 信息。

参数有两种枚举,分别是:ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION 和 ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION。这两种枚举分别代表什么含义呢?看一下源码中的解释:

-
DELETE_ON_CANCELLATION:仅当作业失败时,作业的 Checkpoint 才会被保留用于任务恢复。当作业取消时,Checkpoint 状态信息会被删除,因此取消任务后,不能从 Checkpoint 位置进行恢复任务。
-
RETAIN_ON_CANCELLATION:当作业手动取消时,将会保留作业的 Checkpoint 状态信息。注意,这种情况下,需要手动清除该作业保留的 Checkpoint 状态信息,否则这些状态信息将永远保留在外部的持久化存储中。
无论是选择上述哪种方式,后面都提示了一句:如果 Flink 任务失败了,Checkpoint 的状态信息将被保留。
1.2 生产环境中,该参数应该配置为 DELETE_ON_CANCELLATION 还是 RETAIN_ON_CANCELLATION ?
在 Flink 任务运行过程中,为了保障故障容错,会定期进行 Checkpoint 将状态信息保存到外部存储介质中,当 Flink 任务由于各种原因出现故障时,Flink 任务会自动从 Checkpoint 处恢复,这就是 Checkpoint 的作用。Flink 中还有一个 Savepoint 的概念,Savepoint 与 Checkpoint 类似,同样需要把状态信息存储到外部介质,当作业失败时,可以从外部存储中恢复。Savepoint 与 Checkpoint 的区别如下表所示:
| Checkpoint | Savepoint |
|---|---|
| 由 Flink 的 JobManager 定时自动触发并管理 | 有用户手动触发并管理 |
| 主要用于任务发生故障时,为任务提供自动恢复机制 | 主要时用户升级Flink版本、修改任务的代码逻辑、调整算子并行度等,且必须手动恢复 |
| 当时用RocksDBStateBackend时,支持增量房是对状态信息进行快照 | 仅支持全量快照 |
| Flink任务停止后,Checkpoint的状态快照信息默认被清除 | 一旦触发 Savepoint,状态信息就被持久化到外部存储,除非用户手动删除 |
| Checkpoint 设计目标:轻量级且尽可能快地恢复任务 | Savepoint 的生成和恢复成本会更高一些,Savepoint 更多地关注代码的可移植性和兼容任务的更改操作 |
相比 Savepoint 而言,Checkpoint 更加轻量级,但有些场景 Checkpoint 并不能完全满足我们的需求。所以在使用过程中,如果我们的需求能使用 Checkpoint 来解决优先使用 Checkpoint。当 Flink 任务中的一些依赖组件需要升级重启时,例如 hdfs、Kafka、yarn 升级或者 Flink 任务的 Sink 端对应的 MySQL

本文深入探讨Flink Checkpoint与Savepoint的区别,详解RocksDB增量Checkpoint原理,揭示生产环境中合理清理Checkpoint目录的重要性及正确策略。

最低0.47元/天 解锁文章
1365





