是時候考慮讓Spark運行在K8s上了

對Spark比較關注的開發者應該已經注意到最新的Spark版本支持不做任何修改直接跑在K8s上的消息了,即以Kubernetes容器集羣作爲Cluster Manager實現。早在2017年底,Spark 2.2版本開始時,Spark社區就開始合入用K8s管理Spark集羣的能力,只是那時候功能上還沒有很完善。另外,那個時候的Kubernetes還沒有像現在這麼普及,被廣泛地接受成爲應用基礎設施層。經過2年持續迭代,Spark on Kubernetes已經走向成熟。

其實,大數據和雲計算一直分屬兩個不同的領域,大數據主要關注如何將數據集中起來,挖掘價值。雲計算主要關注如何更加高效地使用資源,提升資源利用效率。當大數據發展到一定階段,就會和雲計算不期而遇。

現狀並不美麗

在技術層面,當前的大數據計算,比如Hadoop和Spark將計算和存儲結合在一起的模式,是分佈式架構的一種嘗試。但是當社區修改HDFS以支持Hadoop 3.0的ErasureCode(糾刪碼)時,即接受:不再(支持就近讀取的策略,這就代表了一種新趨勢。在數據層面,爲取代 HDFS,可以用大規模基於雲的對象存儲,構建在 AWS S3 模型上。計算層面,要能夠根據需要啓動計算,也可以考慮使用類似 Kubernetes 的虛擬化技術,而不是綁定 YARN。

曾經,數據處理任務從遠程物理機讀取數據開銷大。以數據爲“中心”,將數據處理任務遷移到數據所在的物理機上,能有效降低網絡帶寬,保證整體性能。這就是存算一體的大數據技術架構。經過十多年的發展,網絡性能已經提升了100倍,內存容量也提升了數十倍。大數據處理的瓶頸逐漸從網絡轉移到CPU上,上述存算一體架構的缺點也逐漸突顯出來。

  1. 不同場景需要的存儲空間和算力配比是不一樣的。實際使用中要麼計算資源達到瓶頸,要麼是存儲容量不足,只能對集羣進行剛性擴容,造成集羣資源浪費。

  2. 不同時期需要的算力是不固定的,存在波峯和波谷。物理機中存儲數據造成無法大規模關閉閒置節點,造成算力閒置和能源浪費。

  3. 不同業務對運行環境需求不一樣。Spark應用需要綁定Spark集羣運行。Web類型需要實例快速水平擴展。所以通過統一平臺來混合部署提升資源利用率的需求強烈。

容器技術的出現,給了IT行業統一運行環境一線希望。它以自己的build once,run every where的旗幟揮舞到各個IT行業。可以說如果還不考慮使用容器技術,你的基礎平臺的靈活性是絕對不夠的。

統一的ABC平臺

當前大數據的實現代表了構建分佈式系統的一種方法:計算和存儲以及基礎架構結合在一起。但是這條路是否暢通也不好說,畢竟近期有好多文章在說大數據已死。不過話說回來,大數據的數據量是越來越大,大數據的業務需求也只增不減,只是在實現大數據需求的途徑上,方向發生了些偏移。所以並不是大數據本身已死,而是原來的大數據框架底層設施有了新的方向,雲原生大數據已經嶄露頭角。

所謂的ABC就是指AI + Bigdata + Cloud,一般由於業務部門的劃分,或者歷史遺留問題,各廠家做法普遍都是不同的研發部門維護不同的資源池。這就帶來了計算、存儲資源不均衡,資源調度最佳利用率和基礎設施能力共享的問題。特別的基礎設施技術不需要維護多套,降低研發人力成本。

如果想提高整體資源利用率,那就得有統一infrastructure平臺。而且,不同業務類型對資源述求不一樣,比如AI以GPU爲主,Web業務以CPU爲主等。所以要求基礎設施平臺,必須能夠支持多種計算資源,統一調度能力。並且業務也得有統一的運行環境的標準,保證開發&生產的運行一致性。

很明顯,以Docker+Kubernetes技術打造雲原生計算平臺具備這樣的氣質。特別是,以Docker的普適性,真的在各領域勢如破竹。中國聯通數據中心總經理王志軍在2019年6月分享的《中國聯通容器化大數據平臺的探索與實踐》中,提到各省公司的AI訓練,大數據,容器化應用都統一在以Kubernetes+Docker爲底座的統一平臺上,目前擁有節點437個,大量任務同時跑在該平臺上,也是這一趨勢的實踐。

Kubernetes as Infrastructure

大數據領域,計算資源會越來越多容器化。以前容器化主要是被 DevOps和微服務所使用,最近隨着大數據應用的依賴越來越複雜,需要用容器化做更好的依賴管理和資源隔離。容器的一次構建,隨處可運行的特點,非常契合應用運行環境的一致性述求。

大規模容器集羣管理,現在Kubernetes已經是無可爭議的事實標準。作爲Mesos商業化的重要推手,Mesosphere 在2019年8月宣佈正式更名爲 D2IQ,關注點也隨即轉向 Kubernetes 及雲原生領域。VMware則在VMworld 2019宣佈推出新的產品和服務品牌VMware Tanza,全面擁抱K8s。各個領域也是遍地開花,基因數據分析,高性能計算HPC,AI機器學習,傳統互聯網紛紛擁抱容器技術,無不選擇K8s作爲容器計算平臺。真的是踐行了Docker誕生時的理念,不僅僅是build once,而且真的是run every where。現在已經到處都是容器了,該輪到大數據了,幸運的是Spark社區已經上車了,那麼你呢? Spark on K8s可以有。

Volcano: 高性能容器批量計算平臺

K8s自帶的的資源調度器,有一個明顯的特點是,依次調度每個容器。但是當AI訓練,大數據計算,這樣必須多個容器同時配合執行的情況下。依次調度是無法滿足需要的。因爲這些計算任務包含的容器們想要的是,要麼同時都成功,要麼就都別執行。

比如,某個大數據應用需要跑1個Driver容器+10個Executor容器。如果容器是一個一個的調度,假設在啓動最後一個executor容器時,由於資源不足而調度失敗無法啓動。那麼前面的9個executor容器雖然運行着,其實也是浪費的。AI訓練也是一樣的道理,必須所有的Worker都同時運行,才能進行訓練,壞一個,其他的容器就等於白跑。要知道GPU被容器霸佔着卻不能開始計算,成本是非常高的。

所以當總體資源需求小於集羣資源時,普通的K8s自帶調度器可以跑,沒問題。但是當總體資源需求大於集羣資源時,K8s自帶調度器會因爲隨機依次調度容器,使得部分容器無法調度,從而導致業務佔着資源又不能開始計算,死鎖着浪費資源。那麼,上述兩個場景,哪個更加常態呢?不用想,肯定是後者,誰能大方到一直讓集羣空着,這個時候就需要增強型的K8s資源調度器Volcano。

Volcano首先要解決的問題就是Gang Scheduling的問題,即一組容器要麼都成功,要麼都別調度。這個是最基本的用來解決資源死鎖的問題,可以很好的提高資源利用率。除此之外,它還提供了多種調度算法,例如priority優先級,DRF(dominant resource fairness), binpack,task-topology親和,GPU感知,batchwisepack等。多種調度算法插件,根據權重條件,就可以很好的滿足各種複雜場景需求。真正做到統一資源平臺,最佳資源利用率。

目前,Volcano項目已在github開源,歡迎大家參與到項目中來,項目地址:https://github.com/volcano-sh/volcano

結束語

統一的資源池,統一的計算平臺,統一的基礎設施技術棧,這樣資源利用和人力成本都是最優的,可以聚焦到業務創新方向。那麼所有的技術都已經準備好了,是時候讓Spark跑在K8s上了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章