Fluid是一個開源的Kubernetes原生的分布式數據集編排和加速引擎,主要服務于云原生場景下的數據密集型應用,例如大數據應用、AI應用等。JindoRuntime來源于阿里云EMR團隊JindoFS,是基于C++實現的支撐Dataset數據管理和緩存的執行引擎,支持OSS對象存儲。Fluid通過管理和調度JindoRuntime實現數據集的可見性、彈性伸縮和數據遷移。本文介紹如何在注冊集群中使用Fluid加速OSS文件訪問。
實現原理
通過Fluid加速OSS文件訪問的實現原理如下圖所示。
前提條件
已通過容器服務Kubernetes版接入一個注冊的Kubernetes集群。具體操作,請參見創建注冊集群。
已通過kubectl連接注冊集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
步驟一:安裝ack-fluid組件
通過onectl安裝
在本地安裝配置onectl。具體操作,請參見通過onectl管理注冊集群。
執行以下命令,安裝ack-fluid組件。
onectl addon install ack-fluid --set pullImageByVPCNetwork=false
pullImageByVPCNetwork
:為可選參數,設置是否使用VPC網絡拉取組件鏡像。預期輸出:
Addon ack-fluid, version **** installed.
通過控制臺安裝
登錄容器服務管理控制臺,在左側導航欄選擇 。
在應用目錄頁面,搜索并選中ack-fluid。
在頁面右上角,單擊一鍵部署。
在創建面板中,選擇集群,命名空間和發布名稱可保持系統默認,然后單擊下一步。
選擇Chart 版本為當前最新版本,設置組件相關參數,然后單擊確定。
步驟二:準備OSS Bucket數據
步驟三:為本地集群節點打上標簽
執行以下命令,為本地IDC集群中的所有節點打上demo-oss=true
的標簽,該標簽用于設置JindoRuntime的Master和Worker組件的節點調度約束條件。
kubectl label node **** demo-oss=true
步驟四:創建Dataset和JindoRuntime
使用以下內容,創建mySecret.yaml文件。
該文件用于保存OSS的fs.oss.accessKeyId和fs.oss.accessKeySecret,需要在創建Dataset之前創建。
apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: **** fs.oss.accessKeySecret: ****
執行以下命令,部署mySecret文件生成Secret。
kubectl create -f mySecret.yaml
Kubernetes會對已創建的Secret使用加密編碼,避免將其明文暴露。
使用以下內容,創建resource.yaml文件。該YAML文件包含Dataset和JindoRuntime兩部分內容。
Dataset:用于描述遠端存儲數據集和UFS的信息。
JindoRuntime:用于啟動一個JindoFS的集群來提供緩存服務。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: hadoop spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> options: fs.oss.endpoint: <oss_endpoint> name: hadoop path: "/" encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: hadoop spec: # 保證緩存運行時只運行在本地集群的節點中。 master: nodeSelector: demo-oss: "true" worker: nodeSelector: demo-oss: "true" fuse: nodeSelector: demo-oss: "true" replicas: 2 tieredstore: levels: - mediumtype: HDD path: /mnt/disk1 quota: 100G high: "0.99" low: "0.8"
類別
參數
說明
Dataset
mountPoint
oss://<oss_bucket>/<bucket_dir>
為掛載UFS的路徑,路徑中不需要包含Endpoint信息。fs.oss.endpoint
OSS Bucket的Endpoint信息,公網或私網地址皆可。
JindoRuntime
replicas
創建JindoFS集群的Worker數量。
mediumtype
緩存類型。定義創建JindoRuntime模板樣例時,JindoFS暫時僅支持HDD、SSD、MEM的其中一種緩存類型。
path
存儲路徑。暫時只支持單個路徑。當選擇MEM做緩存時,需指定一個本地路徑用于存儲Log等文件。
quota
緩存最大容量,單位為GB。
high
存儲容量上限大小。
low
存儲容量下限大小。
執行以下命令,創建JindoRuntime和Dataset。
kubectl create -f resource.yaml
執行以下命令,查看Dataset的部署情況。
kubectl get dataset hadoop
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 210MiB 0.00B 100.00GiB 0.0% Bound 1h
執行以下命令,查看JindoRuntime的部署情況。
kubectl get jindoruntime hadoop
預期輸出:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE hadoop Ready Ready Ready 4m45s
執行以下命令,查看PV和PVC狀態。
kubectl get pv,pvc
預期輸出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/hadoop 100Gi RWX Retain Bound default/hadoop 52m NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/hadoop Bound hadoop 100Gi RWX 52m
預期輸出表明,Dataset和JindoRuntime已創建成功。
步驟五:創建容器應用體驗加速效果
您可以通過創建容器應用來使用JindoFS加速服務,或者提交機器學習作業來體驗相關功能。本文以創建一個容器應用多次訪問同一數據,并通過對比訪問時間為例展示JindoRuntime的加速效果。
使用以下內容,創建app.yaml文件。
apiVersion: v1 kind: Pod metadata: name: demo-app spec: containers: - name: demo image: fluidcloudnative/serving volumeMounts: - mountPath: /data name: hadoop volumes: - name: hadoop persistentVolumeClaim: claimName: hadoop
執行以下命令,創建容器應用。
kubectl create -f app.yaml
執行以下命令,查看文件大小。
kubectl exec -it demo-app -- bash du -sh /data/spark-3.0.1-bin-hadoop2.7.tgz
預期輸出:
209.7M /data/spark-3.0.1-bin-hadoop2.7.tgz
執行如下命令,查看文件的拷貝時間。
time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /test
預期輸出:
real 1m2.374s user 0m0.000s sys 0m0.256s
預期輸出表明,文件拷貝時間消耗了62s。
執行以下命令,查看此時Dataset的緩存情況。
kubectl get dataset hadoop
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 209.74MiB 209.74MiB 100.00GiB 100.0% Bound 1h
預期輸出表明,209.7 MiB的數據已經緩存到了本地。
執行以下命令,刪除之前的容器應用,新建相同的容器應用。
說明此操作是為了避免其他因素(例如Page Cache)對結果造成影響。
kubectl delete -f app.yaml && kubectl create -f app.yaml
執行如下命令,查看文件拷貝時間。
kubectl exec -it demo-app -- bash time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /test
預期輸出:
real 0m3.454s user 0m0.000s sys 0m0.268s
預期輸出表明,文件的拷貝時間為3s,拷貝時間縮短至原來的十八分之一。主要原因是由于文件已經被JindoFS緩存,所以第二次訪問所需時間遠小于第一次。
(可選)步驟六:清理環境
當不再使用數據加速功能時,您需要執行以下命令清理環境。
執行以下命令,刪除JindoRuntime和應用容器。
kubectl delete jindoruntime hadoop
執行以下命令,刪除Dataset。
kubectl delete dataset hadoop