- checkpoint
应用定时触发,用于保存状态,会过期
内部应用失败重启的时候使用,特点是作业容错自动恢复,轻量,自动周期管理 -
savepoint
用户手动执行,是指向Checkpoint的指针,不会过期
在升级的情况下使用,特点关注状态数据可以移植性,状态数据生成和恢复成本高,用户手动管理
注意:为了能够在作业的不同版本之间以及 Flink 的不同版本之间顺利升级,强烈推荐程序员通过 uid(String) 方法手动的给算子赋予 ID,这些 ID 将用于确定每一个算子的状态范围。如果不手动给各算子指定 ID,则会由 Flink 自动给每个算子生成一个 ID。只要这些 ID 没有改变就能从保存点(savepoint)将程序恢复回来。而这些自动生成的 ID 依赖于程序的结构,并且对代码的更改是很敏感的。因此,强烈建议用户手动的设置 ID。
image.png
生产环境下建议
对于有状态的 Flink 应用,推荐给每个算子都指定唯一用户ID(UUID)。 严格地说,仅需要给有状态的算子设置就足够了。但是因为 Flink 的某些内置算子(如 window)是有状态的,而有些是无状态的,可能用户不是很清楚哪些内置算子是有状态的,哪些不是。所以从实践经验上来说,我们建议每个算子都指定上 UUID。
Flink 算子的 UUID 可以通过 uid(String uid)
方法指定。算子 UUID 使得 Flink 有效地将算子的状态从 savepoint 映射到作业修改后(拓扑图可能也有改变)的正确的算子上,这是 savepoint 在 Flink 应用中正常工作的一个基本要素。
实战
savepoint
- 在flink-conf.yaml中配置Savepoint存储位置
不是必须设置,但是设置后,后面创建指定Job的Savepoint时,可以不用在手动执行命令时指定Savepoint的位置
state.savepoints.dir: hdfs://namenode:9000/flink/savepoints
- 手动创建savepoint,直接触发,或者在cancel时候触发,从savepoint 恢复
bin/flink savepoint jobId [targetDirectory] [-yid yarnAppId]【针对on yarn模式需要指定-yid参数】
bin/flink cancel -s [targetDirectory] jobId [-yid yarnAppId]【针对on yarn模式需要指定-yid参数】
1. 手动触发
flink作业jobid hdfs地址 yarn上执行的id
flink savepoint 4da2561ee17ef9e0bfa7dbd415585b03 hdfs://sss/flink/savepoints -yid application_1558494256595_52618
2. 从savepoint恢复,
关键参数--指定save检查点
flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 1024 -s hdfs://sss/flink/savepoints/savepoint-4da256-8d7d2f53bc9d -c mainclass flink-learn-1.0-SNAPSHOT-jar-with-dependencies.jar
checkpoint
使用方式
env.setStateBackend(new RocksDBStateBackend("hdfs://hadoop100:9000/flink/checkpoints",true));
-
当有taskmanager死掉了,可以自动容错,不用人工干预
image.png
本地checkpoint 恢复 check point 优化
-
相对于从hdsf网络获取,从本地更加快速,但是也会造成额外的开销,实现任务可以在本地启动,需要保存
每个任务的调度位置 Allocation-preserving scheduling
image.png
RocksDBStateBackend:密钥状态支持任务本地恢复。对于完整的检查点,状态被复制到本地文件。这会导致额外的写入成本并占用本地磁盘空间。对于增量快照,本地状态基于RocksDB的本机检查点机制。此机制也用作创建主副本的第一步,这意味着在这种情况下,创建第二副本不会引入额外的成本。我们只需保留本地检查点目录,而不是在上载到分布式存储后将其删除。此本地副本可以与RocksDB的工作目录共享活动文件(通过硬链接),因此对于活动文件,使用增量快照进行任务本地恢复也不会占用额外的磁盘空间。使用硬链接还意味着RocksDB目录必须与所有可用于存储本地状态的配置本地恢复目录位于同一物理设备上,否则建立硬链接可能会失败(请参阅FLINK-10954)。
网友评论