使用Fluid加速邊緣節(jié)點(diǎn)訪問(wèn)OSS文件
Fluid是一個(gè)開(kāi)源的Kubernetes原生的分布式數(shù)據(jù)集編排和加速引擎,主要服務(wù)于云原生場(chǎng)景下的數(shù)據(jù)密集型應(yīng)用,如大數(shù)據(jù)應(yīng)用、AI應(yīng)用等。在邊緣場(chǎng)景中,借助Fluid的數(shù)據(jù)集加速引擎,可以顯著提升邊緣節(jié)點(diǎn)訪問(wèn)OSS文件的速度。本文介紹如何在ACK Edge集群中使用Fluid數(shù)據(jù)加速功能。
前提條件
已創(chuàng)建ACK Edge集群,且集群版本為1.18及以上。具體操作,請(qǐng)參見(jiàn)通過(guò)控制臺(tái)創(chuàng)建集群。
已創(chuàng)建一個(gè)邊緣節(jié)點(diǎn)池,并為其添加邊緣節(jié)點(diǎn),具體操作,請(qǐng)參見(jiàn)創(chuàng)建邊緣節(jié)點(diǎn)池、添加邊緣節(jié)點(diǎn)。
已安裝云原生AI套件并部署ack-fluid組件。
重要若您已安裝開(kāi)源Fluid,請(qǐng)卸載后再部署ack-fluid組件。
未安裝云原生AI套件:安裝時(shí)開(kāi)啟Fluid數(shù)據(jù)加速。具體操作,請(qǐng)參見(jiàn)部署AI套件控制臺(tái)。
已安裝云原生AI套件:在容器服務(wù)管理控制臺(tái)的云原生AI套件頁(yè)面部署ack-fluid。
已通過(guò)kubectl連接Kubernetes集群。具體操作,請(qǐng)參見(jiàn)通過(guò)kubectl工具連接集群。
已開(kāi)通阿里云對(duì)象存儲(chǔ)OSS服務(wù)。具體操作,請(qǐng)參見(jiàn)開(kāi)通OSS服務(wù)。
步驟一:準(zhǔn)備OSS Bucket的數(shù)據(jù)
執(zhí)行以下命令,下載測(cè)試數(shù)據(jù)到ECS實(shí)例中。
wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
將下載的測(cè)試數(shù)據(jù)上傳到阿里云OSS對(duì)應(yīng)的Bucket中。
重要上傳到OSS的步驟以Alibaba Cloud Linux 3.2104 LTS 64位的ECS實(shí)例為例。其他操作系統(tǒng)的具體操作,請(qǐng)參見(jiàn)命令行工具ossutil命令參考和ossutil概述。
創(chuàng)建名稱(chēng)為
examplebucket
的存儲(chǔ)空間。輸入以下命令創(chuàng)建
examplebucket
。ossutil64 mb oss://examplebucket
以下輸出結(jié)果表明已成功創(chuàng)建
examplebucket
。0.668238(s) elapsed
將下載的測(cè)試數(shù)據(jù)上傳到新建的
examplebucket
中。ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket
步驟二:創(chuàng)建Dataset和JindoRuntime
在創(chuàng)建Dataset之前,在ECS實(shí)例中的根目錄中創(chuàng)建一個(gè)
mySecret.yaml
文件。apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: xxx fs.oss.accessKeySecret: xxx
其中,
fs.oss.accessKeyId
和fs.oss.accessKeySecret
是步驟一中用來(lái)訪問(wèn)OSS的AccessKey ID
和AccessKey Secret
。執(zhí)行以下命令,生成Secret。K8s會(huì)對(duì)已創(chuàng)建的Secret使用加密編碼,避免將其明文暴露。
kubectl create -f mySecret.yaml
使用以下YAML文件樣例創(chuàng)建一個(gè)名為
resource.yaml
的文件,里面包含兩部分:創(chuàng)建一個(gè)Dataset,描述遠(yuǎn)端存儲(chǔ)數(shù)據(jù)集和UFS的信息。
創(chuàng)建一個(gè)JindoRuntime,啟動(dòng)一個(gè)JindoFS的集群來(lái)提供緩存服務(wù)。
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"
說(shuō)明在ACK Edge集群中,您需要通過(guò)
nodeAffinity
和nodeSelector
將Dataset和JindoRuntime部署到同一個(gè)節(jié)點(diǎn)池中,確保節(jié)點(diǎn)池內(nèi)的節(jié)點(diǎn)網(wǎng)絡(luò)互通。由于邊緣節(jié)點(diǎn)管控和OSS的訪問(wèn)都需要通過(guò)云邊網(wǎng)絡(luò)訪問(wèn)云上,建議您保證足夠的網(wǎng)絡(luò)帶寬,以免影響到管控通道的穩(wěn)定性。
相關(guān)參數(shù)解釋如下表所示:
參數(shù)
說(shuō)明
mountPoint
oss://<oss_bucket>/<bucket_dir>
表示掛載UFS的路徑。此路徑必須指向一個(gè)目錄,無(wú)法掛載單個(gè)文件,并且不需要包含Endpoint信息。fs.oss.endpoint
OSS Bucket的Endpoint信息,公網(wǎng)或私網(wǎng)地址均支持。更多信息,請(qǐng)參見(jiàn)訪問(wèn)域名和數(shù)據(jù)中心。
replicas
表示創(chuàng)建JindoFS集群的Worker數(shù)量。
mediumtype
表示緩存類(lèi)型。在創(chuàng)建JindoRuntime模板樣例時(shí),JindoFS暫時(shí)只支持HDD/SSD/MEM中的其中一種緩存類(lèi)型。
path
表示存儲(chǔ)路徑,暫時(shí)只支持單個(gè)路徑。當(dāng)選擇MEM做緩存時(shí),需指定一個(gè)本地路徑來(lái)存儲(chǔ)Log等文件。
quota
表示緩存最大容量,單位GB。
high
表示存儲(chǔ)容量上限大小。
low
表示存儲(chǔ)容量下限大小。
執(zhí)行以下命令,創(chuàng)建JindoRuntime和Dataset。
kubectl create -f resource.yaml
執(zhí)行以下命令,查看Dataset的部署情況。
kubectl get dataset hadoop
預(yù)期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 210MiB 0.00B 4.00GiB 0.0% Bound 1h
執(zhí)行以下命令,查看JindoRuntime的部署情況。
kubectl get jindoruntime hadoop
預(yù)期輸出:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE hadoop Ready Ready Ready 4m45s
執(zhí)行以下命令,查看PV和PVC的創(chuàng)建情況。
kubectl get pv,pvc
預(yù)期輸出:
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
從上述輸出的查詢(xún)信息,可以知道Dataset和JindoRuntime已創(chuàng)建成功。
步驟三:創(chuàng)建應(yīng)用容器體驗(yàn)加速效果
您可以通過(guò)創(chuàng)建應(yīng)用容器來(lái)使用JindoFS加速服務(wù),或者提交機(jī)器學(xué)習(xí)作業(yè)來(lái)體驗(yàn)相關(guān)功能。本文以創(chuàng)建一個(gè)應(yīng)用容器多次訪問(wèn)同一數(shù)據(jù),并通過(guò)比較訪問(wèn)時(shí)間來(lái)展示JindoRuntime的加速效果。
使用以下YAML文件樣例,創(chuàng)建名為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
說(shuō)明在ACK Edge集群中,您需要通過(guò)
nodeSelector
將測(cè)試Pod部署到步驟二指定的節(jié)點(diǎn)池中。執(zhí)行以下命令,創(chuàng)建應(yīng)用容器。
kubectl create -f app.yaml
執(zhí)行以下命令,查看文件大小。
kubectl exec -it demo-app -- bash du -sh /data/spark-3.0.1-bin-hadoop2.7.tgz
預(yù)期輸出:
210M /data/spark-3.0.1-bin-hadoop2.7.tgz
執(zhí)行如下命令,查看文件的拷貝時(shí)間。
time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
預(yù)期輸出:
real 0m18.386s user 0m0.002s sys 0m0.105s
從上述輸出信息,可以知道文件拷貝時(shí)間消耗了18s。
執(zhí)行以下命令,查看此時(shí)Dataset的緩存情況。
kubectl get dataset hadoop
預(yù)期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 210.00MiB 210.00MiB 4.00GiB 100.0% Bound 1h
從上述輸出信息,可以知道210 MiB的數(shù)據(jù)已經(jīng)都緩存到了本地。
執(zhí)行以下命令,刪除之前的應(yīng)用容器,新建相同的應(yīng)用容器。
說(shuō)明這樣做的目的是為了避免其他因素(例如:Page Cache)對(duì)結(jié)果造成影響。
kubectl delete -f app.yaml && kubectl create -f app.yaml
執(zhí)行如下命令,查看文件拷貝時(shí)間。
kubectl exec -it demo-app -- bash time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
預(yù)期輸出:
real 0m0.048s user 0m0.001s sys 0m0.046s
從上述輸出信息,可以知道進(jìn)行文件的cp拷貝觀察時(shí)間消耗48 ms,整個(gè)拷貝的時(shí)間縮短了300多倍。
說(shuō)明由于文件已經(jīng)被JindoFS緩存,第二次訪問(wèn)所需時(shí)間遠(yuǎn)小于第一次。
環(huán)境清理
當(dāng)您不再使用該數(shù)據(jù)加速功能時(shí),需要清理環(huán)境。
執(zhí)行以下命令,刪除應(yīng)用容器。
kubectl delete pod demo-app
執(zhí)行以下命令,刪除Dataset和JindoRuntime。
kubectl delete dataset hadoop