作者| 王濤(揚禮)、車漾(必嘫)
來源|
阿裡巴巴雲原生公衆号什麼是 Fluid
Fluid是一個開源的 Kubernetes 原生的分布式資料集編排和加速引擎,主要服務于雲原生場景下的資料密集型應用,例如大資料應用、AI 應用等。通過 Kubernetes 服務提供的資料層抽象,可以讓資料像流體一樣在諸如 HDFS、OSS、Ceph 等存儲源和 Kubernetes 上層雲原生應用計算之間靈活高效地移動、複制、驅逐、轉換和管理。而具體資料操作對使用者透明,使用者不必再擔心通路遠端資料的效率、管理資料源的便捷性,以及如何幫助 Kuberntes 做出運維排程決策等問題。使用者隻需以最自然的 Kubernetes 原生資料卷方式直接通路抽象出來的資料,剩餘任務和底層細節全部交給 Fluid 處理。
Fluid 項目目前主要關注資料集編排和應用編排這兩個重要場景。資料集編排可以将指定資料集的資料緩存到指定特性的 Kubernetes 節點,而應用編排将指定該應用排程到可以或已經存儲了指定資料集的節點上。這兩者還可以組合形成協同編排場景,即協同考慮資料集和應用需求進行節點資源排程。
然後介紹 Fluid 中 Dataset 的概念,資料集是邏輯上相關的一組資料的集合,會被運算引擎使用,比如大資料的 Spark,AI 場景的 TensorFlow,而關于資料集智能的應用和排程會創造工業界的核心價值。Dataset 的管理實際上也有多個次元,比如安全性,版本管理和資料加速。
我們希望從資料加速出發,對于資料集的管理提供支援。在 Dataset 上面,我們通過定義 Runtime 這樣一個執行引擎來實作資料集安全性,版本管理和資料加速等能力,Runtime 定義了一系列生命周期的接口,可以通過實作這些接口來支援資料集的管理和加速,目前 Fluid 中支援的 Runtime 有 AlluxioRuntime 和 JindoRuntime 兩種。Fluid 的目标是為 AI 與大資料雲原生應用提供一層高效便捷的資料抽象,将資料從存儲抽象出來進而達到如下功能:
- 通過資料親和性排程和分布式緩存引擎加速,實作資料和計算之間的融合,進而加速計算對資料的通路。
- 将資料獨立于存儲進行管理,并且通過 Kubernetes 的命名空間進行資源隔離,實作資料的安全隔離。
- 将來自不同存儲的資料聯合起來進行運算,進而有機會打破不同存儲的差異性帶來的資料孤島效應。
什麼是 JindoRuntime
如果要了解 Fluid 的 JindoRuntime,先要介紹 JindoFS。它是 JindoRuntime 的引擎層。
JindoFS 是阿裡雲針對 OSS 開發的自研大資料存儲優化引擎,完全相容 Hadoop 檔案系統接口,給客戶帶來更加靈活、高效的計算存儲方案,目前已驗證支援阿裡雲 EMR 中所有的計算服務和引擎:Spark、Flink、Hive、MapReduce、Presto、Impala 等。JindoFS 有兩種使用模式,塊存儲(Block)模式和緩存(Cache)模式。Block 模式将檔案内容以資料塊的形式存放在 OSS 上并在本地可選擇使用資料備份來進行緩存加速,使用本地的 namespace 服務管理中繼資料,進而通過本地中繼資料以及塊資料建構出檔案資料。Cache 模式将檔案存儲在 OSS 上,該模式相容現有的 OSS 檔案系統,使用者可以通過 OSS 通路原有的目錄結構以及檔案,同時該模式提供資料以及中繼資料的緩存,加速使用者讀寫資料的性能。使用該模式的使用者無需遷移資料到 OSS,可以無縫對接現有 OSS 上的資料,在中繼資料同步方面使用者可以根據不同的需求選擇不同的中繼資料同步政策。
在 Fluid 中,JindoRuntime 也是使用 JindoFS 的 Cache 模式進行遠端檔案的通路和緩存,如您需要在其他環境單獨使用 JindoFS 獲得通路 OSS 的能力,您也可以下載下傳我們的
JindoFS SDK按照使用文檔進行部署使用。JindoRuntime 來源于阿裡雲 EMR 團隊自研 JindoFS 分布式系統,是支撐 Dataset 資料管理和緩存的執行引擎實作。Fluid 通過管理和排程 Jindo Runtime 實作資料集的可見性、彈性伸縮、資料遷移、計算加速等。在 Fluid 上使用和部署 JindoRuntime 流程簡單、相容原生 K8s 環境、可以開箱即用。深度結合對象存儲特性,使用 Navite 架構優化性能,并支援免密、checksum 校驗等雲上資料安全功能。
JindoRuntime 的優勢
JindoRuntime 提供對 Aliyun OSS 對象存儲服務的通路和緩存加速能力,并且利用 FUSE 的 POSIX 檔案系統接口實作可以像本地磁盤一樣輕松使用 OSS 上的海量檔案,具有以下特點:
1. 性能卓越
- OSS 的讀寫性能突出:深度結合 OSS 進行讀寫效率和穩定性的增強,通過 native 層優化對 OSS 通路接口,優化冷資料通路性能,特别是小檔案讀寫。
- 分布式緩存政策豐富:支援單 TB 級大檔案緩存、中繼資料緩存政策等。在大規模 AI 訓練和資料湖場景實測中有突出的性能優勢。
2. 安全可靠
- 認證安全:支援阿裡雲上 STS 免密通路和 K8s 原生的秘鑰加密。
- 資料安全:checksum 校驗、用戶端資料加密等安全政策,保護雲上資料安全和使用者資訊等。
3. 簡單易用
支援原生 K8s 環境,利用自定義資源定義,對接資料卷概念。使用部署流程簡單,可以開箱即用。
4. 輕量級
底層基于 c++ 代碼,整體結構輕量化,各種 OSS 通路接口額外開銷較小。
JindoRuntime 性能怎麼樣
我們使用
ImageNet資料集基于 Kubernetes 叢集并使用
Arena在此資料集上訓練 ResNet-50 模型,基于 JindoFS 的 JindoRuntime 在開啟本地緩存的情況下性能大幅度優于開源 OSSFS,訓練耗時縮短了 76%,該測試場景會在後續文章中進行詳細介紹。
如何快速上手使用 JindoRuntime
使用 JindoRuntime 流程簡單,在準備好基本 K8s 和 OSS 環境的條件下,您隻需要耗費 10 分鐘左右時間即可部署好需要的 JindoRuntime 環境,您可以按照下面的流程進行部署。
- 建立命名空間
kubectl create ns fluid-system
- 下載下傳 fluid-0.5.0.tgz
**
- 使用 Helm 安裝 Fluid
helm install --set runtime.jindo.enabled=true fluid fluid-0.5.0.tgz
- 檢視 Fluid 的運作狀态
$ kubectl get pod -n fluid-system
NAME READY STATUS RESTARTS AGE
csi-nodeplugin-fluid-2mfcr 2/2 Running 0 108s
csi-nodeplugin-fluid-l7lv6 2/2 Running 0 108s
dataset-controller-5465c4bbf9-5ds5p 1/1 Running 0 108s
jindoruntime-controller-654fb74447-cldsv 1/1 Running 0 108s
其中 csi-nodeplugin-fluid-xx 的數量應該與 K8s 叢集中節點 node 的數量相同。
- 建立 dataset 和 JindoRuntime
在建立 dataset 之前,我們可以建立一個 secret 來儲存 OSS 的 fs.oss.accessKeyId 和 fs.oss.accessKeySecret 資訊,避免明文暴露出來,K8s 會對已建立的 secret 使用加密編碼,将 key 和 secret 資訊填入 mySecret.yaml 檔案中。
apiVersion: v1
kind: Secret
metadata:
name: mysecret
stringData:
fs.oss.accessKeyId: xxx
fs.oss.accessKeySecret: xxx
生成 secret:
kubectl create -f mySecret.yaml
建立一個 resource.yaml 檔案裡面包含兩部分:
- 首先包含資料集及 ufs 的 dataset 資訊,建立一個 Dataset CRD 對象,其中描述了資料集的來源。
- 接下來需要建立一個 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
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:
replicas: 2
tieredstore:
levels:
- mediumtype: HDD
path: /mnt/disk1
quota: 100Gi
high: "0.99"
low: "0.8"
- mountPoint:oss://<oss_bucket>/<bucket_dir> 表示挂載 UFS 的路徑,路徑中不需要包含 endpoint 資訊。
- fs.oss.endpoint:oss bucket 的 endpoint 資訊,公網或内網位址皆可。
- replicas:表示建立 JindoFS 叢集的 worker 的數量。
- mediumtype:JindoFS 暫隻支援 HDD/SSD/MEM 中的一種。
- path:存儲路徑,暫隻支援一塊盤,當選擇 MEM 做緩存也需要一塊盤來存儲 log 等檔案。
- quota:緩存最大容量,機關 Gi。
- high:水位上限大小 / low:水位下限大小。
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 180.00GiB 0.0% Bound 1h
- 建立應用容器體驗加速效果
您可以通過建立應用容器來使用 JindoFS 加速服務,或者進行送出機器學習作業來進行體驗相關功能。
接下來,我們建立一個應用容器 app.yaml 來使用該資料集,我們将多次通路同一資料,并比較通路時間來展示 JindoRuntime 的加速效果。
apiVersion: v1
kind: Pod
metadata:
name: demo-app
spec:
containers:
- name: demo
image: nginx
volumeMounts:
- mountPath: /data
name: hadoop
volumes:
- name: hadoop
persistentVolumeClaim:
claimName: hadoop
使用 kubectl 完成建立:
kubectl create -f app.yaml
檢視檔案大小:
$ kubectl exec -it demo-app -- bash
$ du -sh /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz
210M /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz
進行檔案的 cp 觀察時間消耗了 18s:
$ time cp /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
real 0m18.386s
user 0m0.002s
sys 0m0.105s
檢視此時 dataset 的緩存情況,發現 210MB 的資料已經都緩存到了本地。
$ kubectl get dataset hadoop
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE
hadoop 210.00MiB 210.00MiB 180.00GiB 100.0% Bound 1h
為了避免其他因素(比如 page cache)對結果造成影響,我們将删除之前的容器,建立相同的應用,嘗試通路同樣的檔案。由于此時檔案已經被 JindoFS 緩存,可以看到第二次通路所需時間遠小于第一次。
kubectl delete -f app.yaml && kubectl create -f app.yaml
進行檔案的拷貝觀察時間,發現消耗 48ms,整個拷貝的時間縮短了 300 倍。
$ time cp /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
real 0m0.048s
user 0m0.001s
sys 0m0.046s
- 環境清理
- 删除應用和應用容器
- 删除 JindoRuntime
kubectl delete jindoruntime hadoop
- 删除 dataset
kubectl delete dataset hadoop
以上通過一個簡單的例子完成 JindoFS on Fluid 的入門體驗和了解,并最後進行環境的清理,更多 Fluid JindoRuntime 的功能使用後續文章會進行詳細介紹。
- Fluid 項目 GitHub 位址:
- Fluid 項目首頁:
- 社群交流釘群:
作者簡介
王濤,花名揚禮,阿裡巴巴計算平台事業部 EMR 開發工程師,目前從事開源大資料存儲計算方面的開發和優化工作。
車漾,花名必嘫,阿裡巴巴雲原生應用平台進階技術專家,從事 Kubernetes 和容器相關産品的開發。尤其關注利用雲原生技術建構機器學習平台系統,是 GPU 共享排程的主要作者和維護者。
點選通路
“Kubernetes與雲原生應用更多開源實踐”大講堂,4 次開源技術直播, 60+ 節 Kubernetes 經典課程,3 本雲原生電子書,将前沿的容器技術和開源實踐一網打盡!