Fluid是一個開源的Kubernetes原生的分布式資料集編排和加速引擎,主要服務於雲原生情境下的資料密集型應用,如巨量資料應用、AI應用等。在邊緣情境中,藉助Fluid的資料集加速引擎,可以顯著提升邊緣節點訪問OSS檔案的速度。本文介紹如何在ACK Edge叢集中使用Fluid資料加速功能。
前提條件
已建立ACK Edge叢集,且叢集版本為1.18及以上。具體操作,請參見通過控制台建立叢集。
已安裝雲原生AI套件並部署ack-fluid組件。
重要若您已安裝開源Fluid,請卸載後再部署ack-fluid組件。
未安裝雲原生AI套件:安裝時開啟Fluid資料加速。具體操作,請參見部署AI套件控制台。
已安裝雲原生AI套件:在Container Service管理主控台的雲原生AI套件頁面部署ack-fluid。
已通過kubectl串連Kubernetes叢集。具體操作,請參見通過kubectl工具串連叢集。
已開通阿里雲Object Storage Service服務。具體操作,請參見開通OSS服務。
步驟一:準備OSS Bucket的資料
執行以下命令,下載測試資料到ECS執行個體中。
wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
將下載的測試資料上傳到阿里雲OSS對應的Bucket中。
重要上傳到OSS的步驟以Alibaba Cloud Linux 3.2104 LTS 64位的ECS執行個體為例。其他動作系統的具體操作,請參見命令列工具ossutil命令參考和ossutil概述。
建立名稱為
examplebucket
的儲存空間。輸入以下命令建立
examplebucket
。ossutil64 mb oss://examplebucket
以下輸出結果表明已成功建立
examplebucket
。0.668238(s) elapsed
將下載的測試資料上傳到建立的
examplebucket
中。ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket
步驟二:建立Dataset和JindoRuntime
在建立Dataset之前,在ECS執行個體中的根目錄中建立一個
mySecret.yaml
檔案。apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: xxx fs.oss.accessKeySecret: xxx
其中,
fs.oss.accessKeyId
和fs.oss.accessKeySecret
是步驟一中用來訪問OSS的AccessKey ID
和AccessKey Secret
。執行以下命令,產生Secret。K8s會對已建立的Secret使用加密編碼,避免將其明文暴露。
kubectl create -f mySecret.yaml
使用以下YAML檔案範例建立一個名為
resource.yaml
的檔案,裡麵包含兩部分:建立一個Dataset,描述遠端儲存資料集和UFS的資訊。
建立一個JindoRuntime,啟動一個JindoFS的叢集來提供快取服務。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: hadoop spec: nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - npxxxxxxxxxxxxxx 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: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx replicas: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"
說明在ACK Edge叢集中,您需要通過
nodeAffinity
和nodeSelector
將Dataset和JindoRuntime部署到同一個節點池中,確保節點池內的節點網路互連。由於邊緣節點管控和OSS的訪問都需要通過雲邊網路訪問雲上,建議您保證足夠的網路頻寬,以免影響到管控通道的穩定性。
相關參數解釋如下表所示:
參數
說明
mountPoint
oss://<oss_bucket>/<bucket_dir>
表示掛載UFS的路徑。此路徑必須指向一個目錄,無法掛載單個檔案,並且不需要包含Endpoint資訊。fs.oss.endpoint
OSS Bucket的Endpoint資訊,公網或私網地址均支援。更多資訊,請參見訪問網域名稱和資料中心。
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 4.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的加速效果。
使用以下YAML檔案範例,建立名為app.yaml 的檔案。
apiVersion: v1 kind: Pod metadata: name: demo-app spec: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxx containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: hadoop volumes: - name: hadoop persistentVolumeClaim: claimName: hadoop
說明在ACK Edge叢集中,您需要通過
nodeSelector
將測試Pod部署到步驟二指定的節點池中。執行以下命令,建立應用程式容器。
kubectl create -f app.yaml
執行以下命令,查看檔案大小。
kubectl exec -it demo-app -- bash du -sh /data/spark-3.0.1-bin-hadoop2.7.tgz
預期輸出:
210M /data/spark-3.0.1-bin-hadoop2.7.tgz
執行如下命令,查看檔案的拷貝時間。
time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
預期輸出:
real 0m18.386s user 0m0.002s sys 0m0.105s
從上述輸出資訊,可以知道檔案拷貝時間消耗了18s。
執行以下命令,查看此時Dataset的緩衝情況。
kubectl get dataset hadoop
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 210.00MiB 210.00MiB 4.00GiB 100.0% Bound 1h
從上述輸出資訊,可以知道210 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 /dev/null
預期輸出:
real 0m0.048s user 0m0.001s sys 0m0.046s
從上述輸出資訊,可以知道進行檔案的cp拷貝觀察時間消耗48 ms,整個拷貝的時間縮短了300多倍。
說明由於檔案已經被JindoFS緩衝,第二次訪問所需時間遠小於第一次。
環境清理
當您不再使用該資料加速功能時,需要清理環境。
執行以下命令,刪除應用程式容器。
kubectl delete pod demo-app
執行以下命令,刪除Dataset和JindoRuntime。
kubectl delete dataset hadoop