1 概念
1.1 Checkpoint
In order to make state fault tolerant, Flink needs to checkpoint the state. Checkpoints allow Flink to recover state and positions in the streams to give the application the same semantics as a failure-free execution.
为了使状态容错,Flink需要对状态进行检查点。
检查点允许Flink恢复流中的状态和位置,为应用程序提供与无故障执行相同的语义.
1.2 Savepoint
A Savepoint is a consistent image of the execution state of a streaming job, created via Flink’s checkpointing mechanism. You can use Savepoints to stop-and-resume, fork, or update your Flink jobs. Savepoints consist of two parts: a directory with (typically large) binary files on stable storage (e.g. HDFS, S3, …) and a (relatively small) meta data file. The files on stable storage represent the net data of the job’s execution state image. The meta data file of a Savepoint contains (primarily) pointers to all files on stable storage that are part of the Savepoint, in form of relative paths.
Savepoint是流作业执行状态的全局一致性快照,通过Flink的检查点机制创建【savepoint本质上是特殊的checkpoint】。您可以使用保存点来停止和恢复、分叉或更新Flink作业。
Savepoint :用来为整个作业在某个“时间点”(point-in-time)进行快照生成。
该快照包含了数据源读取到的偏移量(offset),输入源的位置信息以及整个应用的状态。
借助 分布式快照算法(Chandy-Lamport )的变体,可以在应用程序运行中得到某个“时间点”一致的快照。
Savepoint 包含了如下两个主要元素:
- 一个目录,通常为一个很大的二进制文件,文件中包含了整个流应用在Savepoint或Checkpoint的状态。
- 一个元数据文件构成,元数据文件通常相对较小,其中包含了指向Savepoint目录中各个文件的指针。
2 区别
Checkpoint | Savepoint | |
---|---|---|
目标 | Flink 中的作业的恢复机制,确保能从潜在的故障中恢复 | 手动备份、恢复暂停作业的方法 |
实现 | 一种轻量与快速的机制,它可能利用底层状态后端的不同功能尽可能快速的恢复数据,如基于RocksDb状态后端的增量Checkpoint,可以极大加速Checkpoint过程,这种设计使得Checkpoint机制变得更加清量 | 更多的关注了应用的可移植性,支持对作业进行修改后状态能保持兼容,对应的状态的生成的恢复的成本更高; |
生命周期 | Flink 自动地周期性的管理(创建和删除等)无需用户的交互 | 用户手动进行管理(调度、创建、删除) |
与传统数据库相比 | 类似传统数据库中恢复日志 | 类似传统数据库中备份 |
侧重点 | 容错 作业意外失败并重启之后,能够直接从早先打下的checkpoint恢复运行,且不影响作业逻辑的准确性 | 维护 作业需要在人工干预下手动重启、升级、迁移或A/B测试时,先将状态整体写入可靠存储,维护完毕之后再从savepoint恢复现场 |
面向对象 | 面向Flink Runtime本身,由Flink的各个TaskManager定时触发快照并自动清理,一般不需要用户干预 | 面向用户,完全根据用户的需要触发与清理 |
执行频率 | 往往比较高(因为需要尽可能保证作业恢复的准确度) | 用户手工触发 |
执行代价及兼容性 | 代价小 checkpoint的存储格式非常轻量级,但作为trade-off牺牲了一切可移植(portable)的东西,比如不保证改变并行度和升级的兼容性 | 代价大 以二进制形式存储所有状态数据和元数据,执行起来比较慢而且“贵”,但是能够保证portability,如并行度改变或代码升级之后,仍然能正常恢复 |
是否支持增量 | 支持增量的(通过RocksDB)特别是对于超大状态的作业而言可以降低写入成本 | 不会连续自动触发,所以savepoint没有必要支持增量 |
使用场景 | 作业运行期间的故障恢复、高可用 | 使用场景如下: 1: 升级新版本如新功能、修复Bug或者一个更好的机器学习模型 2: 引入 A/B 测试,使用相同的源数据测试程序的不同版本,从同一时间点开始测试而不牺牲先前的状态 3:在进行应用程序资源扩容或者缩减时使用 4:Flink 版本切换或者集群迁移时 |
何时使用 | 内部应用失败重启的时候使用,通常只保留最新的N个 | 在升级的情况下使用,不会过期 |
3 配置参数
详见
- 配置
- savepoints
- checkpoints