天天看點

Flink使用Pod Template将狀态快照(Checkpoint、Savepoint)存儲在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"後獲得。

本文由部落格一文多發平台 OpenWrite 釋出!