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