1. 程式人生 > 其它 >Flink使用Pod Template將狀態快照(Checkpoint、Savepoint)儲存在NFS

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 釋出!