Vineyard 加入 CNCF Sandbox,將繼續瞄準雲原生大資料分析領域

Vineyard 加入 CNCF Sandbox,將繼續瞄準雲原生大資料分析領域

Vineyard 是一個專為雲原生環境下大資料分析場景中端到端工作流提供記憶體資料共享的分散式引擎,我們很高興宣佈 Vineyard 在 2021 年 4 月 27 日被雲原生基金會(CNCF)TOC 接受為沙箱(Sandbox)專案。Vineyard 專案開源地址:https://github。com/alibaba/v6d

專案介紹

現有的大資料分析場景中,對於端到端任務,不同的子任務之間通常使用例如 HDFS、S3、OSS 這樣的分散式檔案系統或物件儲存系統,來共享任務之間的中間資料,這種方式在執行效率和研發效率上存在諸多問題,以下圖所示的一個風控作業工作流為例:​

Vineyard 加入 CNCF Sandbox,將繼續瞄準雲原生大資料分析領域

工作流中不同任務之間為了共享中間資料,前一個任務將結果寫入檔案系統,完成之後,後一個再將檔案讀出作為輸入,這個過程帶來了額外的序列化及反序列化、記憶體複製、以及網路、IO 的開銷,我們從歷史任務中觀察到有超過 60% 的任務為此花費了 40% 以上的執行時間。

對於生產環境,為了高效地解決某一個特定正規化的問題往往會引入一個新系統(例如分散式圖計算),但這樣的系統往往難以直接與工作流中的其他系統無縫銜接,需要很多重複的 IO、資料格式轉換和適配的研發工作。

使用外部檔案系統共享資料給工作流帶來了額外的中斷,因為往往只有當一個任務完全寫完所有結果,下一個任務才能開始讀取和計算,這使得跨任務的流水線並行無法被應用。

現有的分散式檔案系統在共享中間資料時,特別是在雲原生環境下,並沒有很好的處理分散式資料的位置問題,造成網路開銷的浪費,從而降低端到端執行效率。

為了解決現有大資料分析工作流中存在的上述問題,我們設計和實現了分散式記憶體資料共享引擎 Vineyard。

Vineyard 加入 CNCF Sandbox,將繼續瞄準雲原生大資料分析領域

Vineyard 從以下三個角度來應對上述幾個問題:

為了使端到端工作流中任務之間的資料共享更加高效,Vineyard 透過記憶體對映的方式,支援系統間零複製的資料共享,省去了額外的 IO 開銷。

為了簡化新計算引擎接入現有系統所需要的適配和開發,Vineyard 對常見的資料型別,提供了開箱即用的抽象,例如 Tensor、DataFrame、Graph,等等,從而不同計算引擎之間共享中間結果不再需要額外的序列化和反序列。同時,Vineyard 將 IO、資料遷移、快照等可複用的元件以外掛的形式實現,使其能夠很靈活地按需註冊到計算引擎中去,降低與計算引擎本身無關的開發成本。

Vineyard 提供一系列 operators,來實現更高效靈活的資料共享。例如 Pipeline operator 實現了跨任務的流水線並行,使得後續任務可以隨著前序任務輸出的產生,同時進行計算,提高了端到端整體效率。

Vineyard 與 Kubernetes 整合,透過 Scheduler Plugin,讓任務的排程能夠感知所需要的資料的區域性性,在 Kubernetes 讓單個任務的 Pod 儘可能地排程到與 Pod 所需的輸入資料對其的機器上,來減小資料遷移需要的網路開銷,提升端到端效能。

在初步的對比實驗中,相比於使用 HDFS 來共享中間資料,對於評測任務,Vineyard 能夠大幅降低用於交換中間結果引入的額外開銷,對於整個工作流的端到端時間有 1。34 倍的提升。

核心功能

接下來從 Vineyard 核心的設計與實現,以及 Vineyard 如何助力雲原生環境中大資料分析任務兩個方面來介紹 Vineyard 的核心功能。

1。 分散式記憶體資料共享

Vineyard 將記憶體中的資料表示為 Object。Object 可以是 Local 的,也可以是 Global 的,以分散式執行引擎 Mars 和 Dask 為例,一個 DataFrame 往往被拆分成很多個 Chunk 以利用多臺機器的計算能力,每臺機器上有多個 Chunk,這些 Chunk 是 Vineyard 中的 LocalObject,這些 Chunk 一起構成了一個全域性的檢視,即 GlobalDataFrame。這個 GlobalDataFrame 能夠直接共享給其他計算引擎,如 GraphScope,作為圖資料的輸入。有了這些資料型別的抽象,Vineyard 上的不同計算引擎之間就可以無縫地共享中間結果,將一個任務的輸出直接用作下一個任務的輸出。​更具體地,Vineyard 中又是如果表達一個特定型別的 Object,使之能夠很容易地適配到不同的計算引擎中去呢?這得益於 Vineyard 在 Object 的表示上提供的靈活性。Vineyard 中,一個 Object 包括兩個部分,Metadata,以及一組 Blob。Blob 中儲存著實際的資料,而 Metadata 則用於解釋這些 Blob 的語義。例如對於 Tensor,Blob 是一段連續記憶體,儲存著 Tensor 中所有的元素,而 Metadata 中記錄了 Tensor 的型別、形狀、以及行主序還是列主序等屬性。在 Python 中,這個 Object 可以被解釋為一個 Numpy 的 NDArray,而在 C++ 中,這個 Object 可以被解釋為一個 xtensor 中的 tensor。這兩種不同程式語言的 SDK 中,共享這個 Tensor 不會帶來額外的 IO、複製、序列化/反序列化、以及型別轉換的開銷。​同時,Vineyard 中的 Metadata 是可巢狀的,這使得我們透過很容易地將任何複雜的資料型別描述為 Vineyard 中的 Object,不會限制計算引擎的表達能力。以 GlobalDataFrame 為例,見下圖中 Metadata 的結構。​

Vineyard 加入 CNCF Sandbox,將繼續瞄準雲原生大資料分析領域

2。 雲原生環境中資料與任務的協同排程

對於一個真實部署的大資料分析流水線,僅僅有任務之間的資料共享是遠遠不夠的。在雲環境中,一個端到端流水線中包含的多個子任務在被 Kubernetes 排程時僅僅考慮了需要的資源約束,連續的兩個任務的 co-locate 無法保證,在兩個任務之間共享中間結果時仍然有資料遷移引入的網路開銷,如下圖,在執行 Task B 時,因為兩個任務的 Pod 沒有對齊,資料分片 A3、A4 需要被遷移到 Pod 所在的 Vineyard 例項上。​

Vineyard 加入 CNCF Sandbox,將繼續瞄準雲原生大資料分析領域

對此,Vineyard 透過 CRD 將叢集中的資料(Vineyard Objects)表示為可觀測的資源,並基於 Kubernetes 的 Scheduler Framework 設計和實現了一個考慮資料區域性性的排程器外掛。當前一個任務 Task A 完成後,從結果物件的 Metadata 中,排程器外掛可以知道所有分片的位置,在啟動下一個任務時,排程器給資料所在的節點(圖中的 Node 1、Node 2)更高的優先順序,使任務 Task B 也儘可能地被排程到對應的節點上,從而省去了資料遷移引入的額外開銷,來改善端到端的效能。

快速上手

Vineyard 集成了 Helm 以方便使用者安裝和部署:

helm repo add vineyard https://vineyard。oss-ap-southeast-1。aliyuncs。com/charts/helm install vineyard vineyard/vineyard

安裝之後,系統中會部署一個 Vineyard DaemonSet,並暴露一個 UNIX domain socket 用於與應用的任務 Pod 之間的共享記憶體和 IPC 通訊。

未來展望

Vineyard 已經作為分散式科學計算引擎 Mars 和一站式圖計算系統 GraphScope 的儲存引擎,Vineyard 助力大資料分析任務離不開與雲原生社群的緊密互動,未來Vineyard 會進一步地完善與社群其他專案如 Kubeflow、Fluid 等的整合,助力更多雲上大資料分析任務。​Vineyard 將繼續與社群同行,支援關注社群的反饋,致力於推動雲原生技術在大資料分析領域的生態建設和應用。歡迎大家關注 Vineyard 專案,加入 Vineyard 社群並參與專案的共建與落地!

作者 | Vineyard 團隊

相關文章