Flink使用Pod Template将状态快照(Checkpoint、Savepoint)存储在NFS
Flink 版本 1.13.3,使用 native k8s 部署模式,原采用 HDFS 作为状态快照(Checkpoint、Savepoint)的存储地址,但是由于仅使用了其 HDFS 作为状态快照存储地址,且 Hadoop 框架较重,在 k8s 集群中占用大量资源,现考虑将其替换为更轻量级的分布式文件系统——NFS。
背景
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值。
PV中所使用到的PVC、StorageClass等部署文件,可在gzh "HEY DATA"后台回复"pod-template"后获得。
更多推荐
所有评论(0)