在Flink 原理与实现:Checkpoint 这篇文章中介绍了 Flink Checkpoint 的原理以及作用,Flink 原理与实现:Savepoint
这篇文章讲述了 Flink Checkpoint 和 Savepoint 的异同。有了这些基础,你就可以在流式计算中对 Flink Checkpoint 进行配置了,下文会详细介绍各种配置方式,以及配置原则。
在 Flink 应用程序中配置 Checkpoint,首先需要开启 Checkpoint,同时指定 Checkpoint 的时间间隔。
val env = StreamExecutionEnvironment.getExecutionEnvironment
// enable Checkpoint and set 10min Checkpoint Interval
env.enableCheckpointing(10 * 1000)
为了对 Checkpoint 进行更多的配置,你需要拿到 CheckpointConfig:
val chkpConf = env.getCheckpointConfig
Flink 默认提供 Extractly-Once 保证 State 的一致性。这可以通过 CheckpointConfig 进行设置,Flink 提供了 Extractly-Once,At-Least-Once 两种模式。
chkpConf.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)
如果只是设置 State 的一致性保障机制,那么可以简单配置成:
env.enableCheckpointing(10 * 1000, CheckpointingMode.EXACTLY_ONCE)
由于每个 Flink 应用程序的 State 大小不同,StateBackend 也可能有所不同,所以,Checkpoint 需要根据实际情况配置。Flink 默认同一时间只允许执行一个 Checkpoint,以避免占用太多正常数据处理资源。如果在配置的 Checkpoint 时间间隔之内,一个 Checkpoint 正在生产,另一个 Checkpoint 也需要开始生产,那么,第二个 Checkpoint 将会等到第一个 Checkpoint 生产完成才会开始。
那么,如果很多 Checkpoint 生产时间过长,比 Checkpoint 时间间隔还要长,会有什么影响呢?在这种情况下,Checkpoint 的配置是不理想的,原因有二:
为了保证应用程序可以全力处理数据,你可以配置 Checkpoint 彼此之间的停顿时间。比如,你配置最小停顿时间是一分钟,那么在一个 Checkpoint 生产完成之后的头一分钟,不会有新的 Checkpoint 被拉起,这仅限于同时最多只有一个 Checkpoint 生产的情况。
chkpConf.setMinPauseBetweenCheckpoints(60 * 1000)
如果某个应用程序的 Checkpoint 生产需要比较长的时间,但由于不用消耗很多资源,那么这时候是可以配置 Checkpoint 更高的并发量的:
chkpConf.setMaxConcurrentCheckpoints(3)
值得注意的一点是:Savepoint 是可以和 Checkpoint 并发生产的。即使有多个 Checkpoint 正在生产的过程中,Savepoint 也会并发生产。
为了避免有 Checkpoint 生产时间过长,导致资源一直被占用,你可以给 Checkpoint 设置一个超时时间,Flink 默认的 Checkpoint 超时时间是 10 分钟。
chkpConf.setCheckpointTimeout(5 * 1000)
众所周知,Checkpoint 失败之后,会触发 Flink 的失败恢复机制进行重启。如果你想禁用这个功能,让应用程序在 Checkpoint 失败后继续执行,可以用下面的方式配置(这个配置的 API 在 Flink 1.9 已经被标记成废弃了)。
chkpConf.setFailOnCheckpointingErrors(false)
另外,在 Flink 1.9 引入了 Checkpoint 失败次数容忍度的配置,默认是 0 次,即对 Checkpoint 的失败是零容忍的,你可以通过 API 进行配置。
chkpConf.setTolerableCheckpointFailureNumber(3)
Checkpoint 的初衷是进行失败恢复,因此,当一个 Flink 应用程序停止时(比如,失败终止、人为取消等),它的 Checkpoint 就会被清除。但是,你可以通过开启外化 Checkpoint 功能,在应用程序停止后,保存 Checkpoint。
chkpConf.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION)
Flink 支持两种外化 Checkpoint:
切记:外化 Checkpoint 并不能代替 Savepoint。它们使用特定于 State Backend 的存储格式,但是没有伸缩性。因此,它们只能满足应用程序失败后的重启,缺乏 Savepoint 的灵活性。
上一节介绍了 Checkpoint 的配置方法,以及 Checkpoint 时间间隔与 Checkpoint 生产时间的关系对 Flink 应用程序的影响。Checkpoint 的配置需要随着 Flink 应用程序的不同而不同。这里简单介绍一下 Checkpoint 的配置原则:
state.backend.local-recovery
值为 true 进行激活。state.checkpoints.num-retained
设置 Checkpoint 保存数。Checkpoint 是 Flink 的失败恢复机制,它的配置对于 Flink 应用程序的性能和稳定性有着至关重要的影响。Checkpoint 需要根据 Flink 应用程序的不同而进行不同的配置,根据相关配置原则,以求达到理想的配置,使 Flink 应用程序性能和稳定性最优化。