1. 什么是 Savepoint ?
Savepoint 是依据 Flink checkpointing 机制所创建的流作业执行状态的一致镜像。 你可以使用 Savepoint 进行 Flink 作业的停止与重启、fork 或者更新。 Savepoint 由两部分组成:稳定存储(列入 HDFS,S3,…) 上包含二进制文件的目录(通常很大),和元数据文件(相对较小)。 稳定存储上的文件表示作业执行状态的数据镜像。 Savepoint 的元数据文件以(相对路径)的形式包含(主要)指向作为 Savepoint 一部分的稳定存储上的所有文件的指针。
2. 操作 Savepoint
2.1 触发 Savepoint
$ bin/flink savepoint :jobId [:targetDirectory]
这将触发 ID 为 :jobId 的作业的 Savepoint,并返回创建的 Savepoint 路径。 你需要此路径来恢复和删除 Savepoint 。你也可以指定创建 Savepoint 的格式。如果没有指定,会采用标准格式创建 Savepoint。
$ bin/flink savepoint --type [native/canonical] :jobId [:targetDirectory]
2.2 使用 YARN 触发 Savepoint
$ bin/flink savepoint :jobId [:targetDirectory] -yid :yarnAppId
这将触发 ID 为 :jobId 和 YARN 应用程序 ID :yarnAppId 的作业的 Savepoint,并返回创建的 Savepoint 的路径。
2.3 使用 Savepoint 停止作业
$ bin/flink stop --type [native/canonical] --savepointPath [:targetDirectory] :jobId
这将自动触发 ID 为 :jobid 的作业的 Savepoint,并停止该作业。此外,你可以指定一个目标文件系统目录来存储 Savepoint 。该目录需要能被 JobManager(s) 和 TaskManager(s) 访问。你也可以指定创建 Savepoint 的格式。如果没有指定,会采用标准格式创建 Savepoint。
2.4 从 Savepoint 恢复
$ bin/flink run -s :savepointPath [:runArgs]
这将提交作业并指定要从中恢复的 Savepoint 。 你可以给出 Savepoint 目录或 _metadata 文件的路径。
2.5 删除 Savepoint
$ bin/flink savepoint -d :savepointPath
这将删除存储在 :savepointPath 中的 Savepoint。
请注意,还可以通过常规文件系统操作手动删除 Savepoint ,而不会影响其他 Savepoint 或 Checkpoint(请记住,每个 Savepoint 都是自包含的)。 在 Flink 1.2 之前,使用上面的 Savepoint 命令执行是一个更乏味的任务。
3. 配置 Savepoint 存储位置
你可以通过 state.savepoints.dir 配置 savepoint 的默认目录。 触发 savepoint 时,将使用此目录来存储 savepoint。
默认 Savepoint 目标目录
state.savepoints.dir: hdfs:///flink/savepoints
4. 实操案例
4.1 提交应用
$ flink run --class com.daidai.watermarks.AllowedLateness ./Flink1.13_Java-1.0-SNAPSHOT.jar
4.2 触发 Savepoint
$ flink savepoint fbc0bdfb2ee5806c931dd8158868b573 hdfs://daidai:8020/flink_savepoint
4.3 停止应用
$ flink cancel fbc0bdfb2ee5806c931dd8158868b573
4.4 从 Savepoint 恢复
$ flink run -s hdfs://daidai:8020/flink_savepoint/savepoint702b87-0a11b997fa70 --class com.daidai.watermarks.AllowedLateness ./Flink1.13_Java-1.0-SNAPSHOT.jar