Fluid是一個開源的Kubernetes原生分布式數據集編排和加速引擎,主要服務于云原生場景下的數據密集型應用。Fluid可以通過管理和調度底層緩存Runtime實現數據集的可見性、彈性伸縮和數據遷移。本文以JindoFS為例演示如何定時數據加載。
前提條件
已創建ACK集群Pro版,且集群版本為1.18及以上。具體操作,請參見創建ACK集群Pro版。
已安裝云原生AI套件并部署ack-fluid組件。
重要若您已安裝開源Fluid,請卸載后再部署ack-fluid組件。
需確保ack-fluid版本為1.0.3。
已通過kubectl連接Kubernetes集群。具體操作,請參見通過kubectl工具連接集群。
步驟一:準備OSS Bucket的數據
執行以下命令,下載一份測試數據。
wget https://archive.apache.org/dist/hbase/2.5.2/RELEASENOTES.md
安裝ossutil,并創建Bucket。具體操作,請參見安裝ossutil。
執行以下命令,將下載的測試數據上傳到阿里云OSS對應的Bucket上。
ossutil64 cp RELEASENOTES.md oss://<bucket>/<path>/RELEASENOTES.md
步驟二:創建Dataset和JindoRuntime
創建一個
mySecret.yaml
文件,用于保存OSS的accessKeyId
和accessKeySecret
。YAML示例如下所示。apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: ****** # 請輸入accessKeyId。 fs.oss.accessKeySecret: ****** # # 請輸入accessKeySecret。
執行以下命令,生成Secret。
kubectl create -f mySecret.yaml
預期輸出:
secret/mysecret created
創建一個
dataset.yaml
文件,用于創建Dataset。apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: demo spec: mounts: - mountPoint: oss://<bucket-name>/<path> options: fs.oss.endpoint: <oss-endpoint> name: hbase 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 accessModes: - ReadOnlyMany --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: demo spec: replicas: 1 tieredstore: levels: - mediumtype: MEM path: /dev/shm quota: 2Gi high: "0.99" low: "0.8" fuse: args: - -okernel_cache - -oro - -oattr_timeout=60 - -oentry_timeout=60 - -onegative_timeout=60
相關參數解釋如下表所示:
參數
說明
Dataset
mountPoint
oss://<oss_bucket>/<path>表示掛載UFS的路徑,路徑中不需要包含Endpoint信息。
fs.oss.endpoint
OSS Bucket的Endpoint信息,公網或私網地址皆可。
accessModes
Dataset的訪問模式。
JindoRuntime
replicas
創建JindoFS集群的Worker數量。
mediumtype
緩存類型。定義創建JindoRuntime模板樣例時,JindoFS支持HDD、SSD、MEM其中任意一種緩存類型。
path
存儲路徑,暫時只支持單個路徑。當選擇MEM做緩存時,需指定一個本地路徑來存儲Log等文件。
quota
緩存最大容量,單位GB。緩存容量可以根據UFS數據大小自行配置。
high
存儲容量上限大小。
low
存儲容量下限大小。
fuse.args
表示可選的Fuse客戶端掛載參數。通常與Dataset的訪問模式搭配使用。
當Dataset訪問模式為ReadOnlyMany時,開啟kernel_cache以利用內核緩存優化讀性能。此時您可以設置attr_timeout(文件屬性緩存保留時間)、entry_timeout(文件名讀取緩存保留時間)超時時間、negative_timeout(文件名讀取失敗緩存保留時間),默認均為7200s。
當Dataset訪問模式為ReadWriteMany時,建議您使用默認配置。此時參數設置如下:
- -oauto_cache
- -oattr_timeout=0
- -oentry_timeout=0
- -onegative_timeout=0
說明使用auto_cache以確保如果文件大小或修改時間發生變化,緩存就會失效。同時將超時時間都設置為0。
執行以下命令,通過部署
dateset.yaml
創建JindoRuntime和Dataset。kubectl create -f dataset.yaml
預期輸出:
dataset.data.fluid.io/demo created jindoruntime.data.fluid.io/demo created
執行以下命令,查看Dataset的部署情況。
kubectl get dataset
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE demo 588.90KiB 0.00B 10.00GiB 0.0% Bound 2m7s
步驟三:創建支持定時運行的Dataload
創建一個
dataload.yaml
文件。apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: cron-dataload spec: dataset: name: demo namespace: default policy: Cron schedule: "*/2 * * * *" # Run every 2 min
相關參數解釋如下表所示:
參數
說明
dataset
包含執行Dataload的數據集的名稱和命名空間。
policy
表示執行策略,目前支持Once和Cron。這里創建定時Dataload任務。
Once:僅執行一次策略。
Cron:定時執行策略。
schedule
表示觸發Dataload的策略。
.spec.schedule
字段的值遵循Cron語法,詳細信息,請參見Cron時間表語法。關于Dataload高級配置,請參見如下配置文件:
apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: cron-dataload spec: dataset: name: demo namespace: default policy: Cron # 表示Dataload執行策略,包括[Once, Cron]。 schedule: * * * * * # 僅當cron使用的policy為Cron時有效。 loadMetadata: true # 在Dataload前同步元數據。 target: # Dataload的目標,支持指定的多個目標。 - path: <path1> # 執行Dataload的路徑。 replicas: 1 # 緩存的副本數。 - path: <path2> replicas: 2
執行以下命令,通過部署
dataload.yaml
來創建Dataload任務。kubectl apply -f dataload.yaml
預期輸出:
dataload.data.fluid.io/cron-dataload created
執行以下命令,查看Dataload狀態。
kubectl get dataload
如下所示,當
PHASE
的狀態為Complete
時,表明數據已加載完成,可進入下一步操作。NAME DATASET PHASE AGE DURATION cron-dataload demo Complete 68s 8s
執行以下命令,查看當前Dataset狀態。
kubectl get dataset
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE demo 588.90KiB 588.90KiB 10.00GiB 100.0% Bound 5m50s
結果輸出表明,OSS中的文件已經全部加載到緩存。
步驟四:創建應用容器訪問OSS中的數據
創建一個
app.yaml
文件,使用應用容器訪問RELEASENOTES.md
文件。apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /data name: demo-vol volumes: - name: demo-vol persistentVolumeClaim: claimName: demo
執行以下命令,創建應用容器。
kubectl create -f app.yaml
預期輸出:
pod/nginx created
等待應用容器就緒后,執行以下命令,查看OSS中的數據。
kubectl exec -it nginx -- ls -lh /data
預期輸出:
total 589K -rwxrwxr-x 1 root root 589K Jul 31 04:20 RELEASENOTES.md
執行以下命令,將字符串
"hello, crondataload."
寫入RELEASENOTES.md
文件中。echo "hello, crondataload." >> RELEASENOTES.md
執行以下文件,重新上傳
RELEASENOTES.md
文件到OSS。ossutil64 cp RELEASENOTES.md oss://<bucket-name>/<path>/RELEASENOTES.md
按下確認鍵
y
后,預期輸出:cp: overwrite "oss://<bucket-name>/<path>/RELEASENOTES.md"(y or N)? y Succeed: Total num: 1, size: 21. OK num: 1(upload 1 files). average speed 0(byte/s) 81.827978(s) elapsed
執行以下命令,查看Dataload作業運行情況。
kubectl describe dataload cron-dataload
預期輸出:
... Status: Conditions: Last Probe Time: 2023-08-24T06:44:08Z Last Transition Time: 2023-08-24T06:44:08Z Status: True Type: Complete Duration: 8s Last Schedule Time: 2023-08-24T06:44:00Z # 為上一次Dataload作業的調度時間。 Last Successful Time: 2023-08-24T06:44:08Z # 為上一次Dataload作業的完成時間。 Phase: Complete ...
執行以下命令,查看當前Dataset狀態。
kubectl get dataset
預期輸出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE demo 588.90KiB 1.15MiB 10.00GiB 100.0% Bound 10m
預期輸出表明,更新后的文件已經加載到了緩存。
執行以下命令,在應用容器中查看更新后的文件。
kubectl exec -it nginx -- tail /data/RELEASENOTES.md
預期輸出:
hello, crondataload.
輸出結果表明,應用容器已經可以訪問更新后的文件。
(可選)步驟五:環境清理
若無需使用該數據加速功能時,請清理環境。
執行以下命令,刪除JindoRuntime和應用容器。
kubectl delete -f app.yaml
kubectl delete -f dataset.yaml
預期輸出:
pod "nginx" deleted
dataset.data.fluid.io "demo" deleted
jindoruntime.data.fluid.io "demo" deleted