导读:Flink 提供了Savepoint保存点,我们可以使用 Savepoint 进行 Flink 作业的停止与重启恢复等。而保存点存储位置是由flink-conf.yaml配置文件中的state.savepoints.dir属性进行指定的。常见如存储在本地 file:///flink/savepoints或 HDFS hdfs:///flink/savepoints,Flink同时也支持了其他的Flie System,本章主要讨论的是如何将savepoint存于阿里云OSS上。
基础概念
- Flink Savepoint,是依据 Flink checkpointing 机制所创建的流作业执行状态的一致镜像。 可以使用 Savepoint 进行 Flink 作业的停止与重启、fork 或者更新。
- OSS,是阿里云提供的海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%的数据可靠性。使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。
![69cf91967eeff9d5f87c64aac1226339.png](https://i-blog.csdnimg.cn/blog_migrate/46478a70fbf77570e3f19ee538597855.jpeg)
配置
注:本例Flink采用Standalone Cluster形式部署,版本 1.10
1、为了使Flink支持OSS,需要将 /flink/opt 目录中将 flink-oss-fs-hadoop-1.10.0.jar 复制到 /flink/lib 目录下。其作用是为oss:// scheme的 URLs 注册默认的FileSystem包装器。
![61e9dc5da5ad7e1e506da3039acb9b6d.png](https://i-blog.csdnimg.cn/blog_migrate/96c8195060d6b70e898d641961f79455.jpeg)
2、修改/flink/conf/flink-conf.yaml 文件中state.savepoints.dir属性,缺省Savepoint目标目录
state.savepoints.dir: oss:///
![b491a5d212fd0b787f0b06cfa8ac2e32.png](https://i-blog.csdnimg.cn/blog_migrate/15e0ed332075bc4243afaabf3bfc7a66.jpeg)
3、设置OSS FileSystem包装器后还需要添加确保允许Flink可以访问OSS的一些配置
![e5b2ef520cf50876109758253aa739aa.png](https://i-blog.csdnimg.cn/blog_migrate/06057713c1a95411898ff909ad1cb2c4.jpeg)
#必须配置的参数fs.oss.endpoint、fs.oss.accessKeyId、fs.oss.accessKeySecret#其他配置可参考http://hadoop.apache.org/docs/current/hadoop-aliyun/tools/hadoop-aliyun/index.html
4、启动集群
#启动集群/flink/bin/start-cluster.sh
![481fb1d10854932115c3c9b26833c46b.png](https://i-blog.csdnimg.cn/blog_migrate/bd6e51ca291527fbc5ef5937917fe9d6.jpeg)
测试
1、通过Apache Flink Dashboard 提交一个Flink Job
![7240534f19afa3fae4ba01736b229530.png](https://i-blog.csdnimg.cn/blog_migrate/84dfa9a31ddd03867323c3cf306a23de.jpeg)
2、使用REST API 接口停止 Job
Flink 官方提供了一套REST API,可用于查询正在运行的作业以及最近完成的作业的状态和统计信息等。https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html
这里我们调用 /jobs/:jobid/stop 停止Job,这里有两个参数:
- targetDirectory:指定savePoint的保存地址(根据官方文档说明,在这里指定目标目录会覆盖缺省值。而如果既未配置缺省值也未指定自定义目标目录,则触发 Savepoint 将失败)
- drain:(可选)设置为true可以在获取保存点之前刷新MAX_WATERMARK,以清除等待计时器启动的任何状态
![b9b2ada5a994a504db15b74d8021b9e7.png](https://i-blog.csdnimg.cn/blog_migrate/c4730073836ea5e90315242d27de3ae7.jpeg)
调用后查看结果,返回一个requestId值,该值是接下来要获取savepoint路径的triggerid。
![a6da7ecad241f9c67c2357e9882d2a84.png](https://i-blog.csdnimg.cn/blog_migrate/a485d4ae7b92526a7fed4adec2de071b.jpeg)
3、由于调用的停止Job服务是一个异步操作,并没有立即返回给我们savepoint路径。这时候需要调用 /jobs/:jobid/savepoints/:triggerid 获取savePoint路径
![2147d69d01f50c59e4bb31f87f5c7a67.png](https://i-blog.csdnimg.cn/blog_migrate/b898f0d9234c8430282ef975dfa850b9.jpeg)
调用后结果返回了savepointPath
![7e865e73aff66bdd20934fb9232ff687.png](https://i-blog.csdnimg.cn/blog_migrate/c1e2a40761d6ad6458b9f2d7cd12fff3.jpeg)
4、查看阿里云 OSS,savepoint保存成功
![884d5f8a4a3d5a265eff308fce144c40.png](https://i-blog.csdnimg.cn/blog_migrate/63ff76280931e96b8f84c2020673c1f2.jpeg)
5、使用savepoint恢复Job,通过REST API /jars/:jarid/run 接口恢复Job,savepointPath参数中上传刚才获取到的savePointPath
![ea5fea44f56727f6fbbc5c97c8248300.png](https://i-blog.csdnimg.cn/blog_migrate/2178917b29523baed80ec119916b0153.jpeg)
![69c0947fdcbf5d889dcc00c52799ea01.png](https://i-blog.csdnimg.cn/blog_migrate/0d1e2ea4a7f22405f61450d35229b015.jpeg)
Job 恢复成功
![f11dc983549f62ec3cb7eddbaa99345e.png](https://i-blog.csdnimg.cn/blog_migrate/808e49bd1460cadc29a16480ae73d076.jpeg)
最后
以上就是如何将Flink的savepoint保存到阿里云OSS上解决方案,大致为以下几部
- 移动 flink-oss-fs-hadoop-1.10.0.jar至lib 目录下
- 修改flink-conf.yaml的 state.savepoints.dir属性
- 在flink-conf.yaml中加入允许Flink访问OSS的属性
感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将坚持持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步