背景
Flink 版本 1.13.3,使用 native k8s 部署模式,原采用 HDFS 作为状态快照(Checkpoint、Savepoint)的存储地址,但是由于仅使用了其 HDFS 作为状态快照存储地址,且 Hadoop 框架较重,在 k8s 集群中占用大量资源,现考虑将其替换为更轻量级的分布式文件系统——NFS。
状态后端参数设置
从 Flink1.13 开始,状态后端分为两种:HashMapStateBackend、EmbeddedRocksDBStateBackend。如果不显示指定状态后端,则 Flink 会使用 HashMapStateBackend。
状态后端 | 状态内存中存储位置 | 是否支持异步快照 |
---|---|---|
HashMapStateBackend | JVM 堆内存 | 否 |
EmbeddedRocksDBStateBackend | RocksDB(堆外托管内存) | 是 |
本文使用EmbeddedRocksDBStateBackend + FileSystemCheckpointStorage 的方式存储。算子状态存储在 RocksDB 数据库中,Checkpoint 和 Savepoint 存储在挂载到 jobmanager 的文件中。参数设置如下:
state.backend: rocksdb
state.checkpoint-storage: filesystem
state.checkpoints.dir: /opt/flink/checkpoint
state.savepoints.dir: /opt/flink/Savepoint
kubernetes.pod-template-file: /opt/flink/conf/pod-template.yaml
pod-template 由于存储 Checkpoint 和 Savepoint 的文件需要被所有的 taskmanager 和 jobmanager 访问到,本文使用 PV、 PVC 挂载NFS(NFS的安装与使用请自行百度)文件。可以使用 kubernetes.pod-template-file 参数指定pod-template.yaml存放在本地的文件位置,通过该 yaml 文件指定Checkpoint、Savepoint的存储位置。
pod-template.yaml 如下:
apiVersion: v1
kind: Pod
spec:
containers:
# Do not change the main container name
- name: flink-main-container
volumeMounts:
- mountPath: /opt/flink/Checkpoint
name: Checkpoint
- mountPath: /opt/flink/Savepoint
name: Savepoint
volumes:
- name: Checkpoint
persistentVolumeClaim:
claimName: flink-checkpoint-pvc
- name: Savepoint
persistentVolumeClaim:
claimName: flink-savepoint-pvc
另外该 yaml 文件还可以根据优先级设置 JobManager 和 TaskManager 的其他参数:
- Defined by Flink:用户无法配置。
- Defined by the user:用户可以自由指定,Flink框架不会设置。该值会首先使用显式配置,然后是pod-template.yaml里的值,如果没有指定,使用默认值。
- Merged with Flink:Flink值与用户定义值合并,若名称相同,使用Flink值。
本文由博客一文多发平台 OpenWrite 发布!
推荐阅读
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- Python|教你写个简单好用的Python脚本一键自动整理文件非常适合办公用~
- 为了搭建冬奥会志愿者系统,他独自跨越大半个中国学习低代码
- 程序员|程序员“真实”日常(每天敲代码不到 1 小时)
- GitHub|7 款可替代 top 命令的工具
- 程序员|自学编程,学完新的又忘旧的,该怎么办()
- 程序员|Python和C究竟选哪个()
- 程序员|5 分钟解决前后端联调问题,说一说前端代理这件事