存儲(chǔ)的三個(gè)演進(jìn)方向
存儲(chǔ)最主要是向三個(gè)方向演進(jìn):Scalability、Cloud、Machine Learning。
Scalability 主要是指 Hadoop 的分布式文件系統(tǒng) HDFS 仍然有提高擴(kuò)展性的需求和空間,后面會(huì)詳細(xì)展開講。Cloud 也是一個(gè)非常重要的方向,云上的對(duì)象存儲(chǔ)甚至有取代 HDFS 成為云端大數(shù)據(jù)默認(rèn)存儲(chǔ)的趨勢(shì),所以 HDFS 如何與云端對(duì)象存儲(chǔ)配合是一個(gè)重要的趨勢(shì)。另一方面,隨著機(jī)器學(xué)習(xí) AI 的興起,從數(shù)據(jù)存儲(chǔ)的角度來(lái)看,這和傳統(tǒng)大數(shù)據(jù)的存儲(chǔ)方式很不一樣,比如小的數(shù)據(jù)碎片會(huì)很多,這對(duì) HDFS 帶來(lái)了很多新場(chǎng)景和新挑戰(zhàn)。
擴(kuò)展性增強(qiáng)
先看 Scalability 的問(wèn)題,我們先來(lái)回顧一下 HDFS 的架構(gòu)。
如圖所示,在 Master 節(jié)點(diǎn)也即 Namenode 這里主要有兩部分工作:一是命名空間管理,另外一個(gè)是數(shù)據(jù)塊管理。分工也很明確:前者負(fù)責(zé)維護(hù)文件路徑到數(shù)據(jù)塊 ID 的映射,后者負(fù)責(zé)從數(shù)據(jù)塊 ID 到 Datanode 上數(shù)據(jù)塊位置的映射。兩個(gè)映射結(jié)合就可以從文件路徑來(lái)定位到具體數(shù)據(jù)塊存儲(chǔ)的位置,便于對(duì)數(shù)據(jù)的訪問(wèn)。
這里有幾個(gè)核心特點(diǎn):
Namenode 把所有的元數(shù)據(jù)信息存到內(nèi)存中;
元數(shù)據(jù)信息的操作延遲是非常低的,便于快速響應(yīng)元數(shù)據(jù)信息訪問(wèn)的需求;
它整體的架構(gòu)和 I/O 模型是易于擴(kuò)展到 PB 乃至上百 PB 級(jí)數(shù)據(jù)規(guī)模的。
這個(gè)架構(gòu)的長(zhǎng)處同時(shí)也是它的短處。設(shè)想當(dāng)集群擴(kuò)展至 4000 個(gè)節(jié)點(diǎn)以上時(shí),并且存儲(chǔ)超過(guò) 5 億個(gè)文件時(shí),所有元數(shù)據(jù)(命名空間、塊管理等)要存放在 Namenode 的內(nèi)存里,同時(shí)要考慮到同時(shí)并行的文件操作以及數(shù)據(jù)塊上報(bào)、RPC 的響應(yīng)等因素,這個(gè)時(shí)候就會(huì)遭遇擴(kuò)展瓶頸。更不幸的是,如果集群存儲(chǔ)的是海量小文件,這個(gè)瓶頸期會(huì)更快到來(lái)。
從上面可以看到,Namenode 很容易成為整個(gè)集群擴(kuò)展性的瓶頸,所以很多優(yōu)化都是圍繞于此。首先看觀察者 Namenode 這個(gè)特性。我們注意到超過(guò)一半的對(duì) Namenode 訪問(wèn)屬于讀訪問(wèn),而之前為了實(shí)現(xiàn)高可用性,HDFS 早已實(shí)現(xiàn)主備(active-standby)架構(gòu)。如果讀請(qǐng)求可以由之前基本閑置的 standby Namenode 來(lái)響應(yīng),就可以有效降低對(duì)主 Namenode 的壓力。從社區(qū)報(bào)告的一些生產(chǎn)集群的應(yīng)用實(shí)測(cè)可以發(fā)現(xiàn),這個(gè)特性可以緩解主 Namenode 大約 20% 的壓力。
其次來(lái)看一下 Namenode 聯(lián)邦(Federation)這個(gè)特性。這個(gè)特性有兩個(gè)版本:一個(gè)是早期的實(shí)現(xiàn),通過(guò)把集群的所有節(jié)點(diǎn)劃分成不同的子集群,子集群有獨(dú)立的命名空間,用戶 / 客戶端需要顯式的指定子集群的命名空間。這種方式的缺點(diǎn)很明顯,即邏輯上所有數(shù)據(jù)無(wú)法采用統(tǒng)一的命名空間,也無(wú)法橫跨多集群來(lái)做在平衡等。
另外一個(gè)是最近開發(fā)的基于路由的聯(lián)邦(Router Based Federation,簡(jiǎn)稱 RBF)特性。這個(gè)特性的設(shè)計(jì)思路是比較通用的方式,包括 YARN 也采用了類似的方案。基本設(shè)計(jì)理念是提供一個(gè)單獨(dú)的聯(lián)邦層,包含路由(Router)以及狀態(tài)存儲(chǔ) (State Store) 兩大模塊。路由提供和 Namenode 一樣的服務(wù),只是所有的訪問(wèn)會(huì)通過(guò)路由進(jìn)入相應(yīng)的 HDFS 子集群,反饋相應(yīng)的結(jié)果。而狀態(tài)存儲(chǔ)則會(huì)保存命名空間和子集群的映射關(guān)系,方便路由來(lái)跟蹤記錄并提供相應(yīng)的服務(wù)。這種實(shí)現(xiàn)方式對(duì)客戶端更友好,完全可以達(dá)到對(duì)客戶端透明。
面向云的演化
對(duì)于 Hadoop 存儲(chǔ)面向云的演化,主要是看 HDFS 如何跟云上的對(duì)象存儲(chǔ)配合。
這里有四種不同的架構(gòu):如圖所示,第一種架構(gòu)是主體采用 HDFS,云的對(duì)象存儲(chǔ)主要起備份和恢復(fù)的作用;第二種架構(gòu)是輸入在云對(duì)象存儲(chǔ),輸出到 HDFS;第三種架構(gòu),輸入輸出都在云對(duì)象存儲(chǔ),HDFS 用來(lái)轉(zhuǎn)儲(chǔ)中間結(jié)果;最后一種,應(yīng)用無(wú)需感知對(duì)象存儲(chǔ),由 HDFS 來(lái)負(fù)責(zé)數(shù)據(jù)在對(duì)象存儲(chǔ)里的寫入與加載。我們認(rèn)為最后一種是比較理想的一種情況,因?yàn)榫€下運(yùn)行良好的大數(shù)據(jù)應(yīng)用無(wú)需任何修改即可遷移至云端。
針對(duì)第四種架構(gòu),HDFS 社區(qū)開發(fā)了對(duì)象存儲(chǔ)掛載這個(gè)特性。
如圖所示,在 HDFS 的命名空間的任何位置都可以設(shè)置掛載點(diǎn)來(lái)掛載遠(yuǎn)程的命名空間,標(biāo)識(shí)成 PROVIDED 層次。HDFS 會(huì)通過(guò) StoragePolicy 來(lái)管理數(shù)據(jù)在不同層次之間的移轉(zhuǎn)。
機(jī)器學(xué)習(xí)
針對(duì)云和機(jī)器學(xué)習(xí)場(chǎng)景,Hadoop 社區(qū)開發(fā)了 OZone 項(xiàng)目。這個(gè)前景遠(yuǎn)大的產(chǎn)品有很多特點(diǎn),包括:無(wú)限的擴(kuò)展能力,強(qiáng)一致性的對(duì)象存儲(chǔ)能力,與主流計(jì)算調(diào)度框架 YARN 和 Kubernetes 無(wú)縫對(duì)接,以及同時(shí)兼容對(duì)象存儲(chǔ)與 HDFS API 等。目前 Ozone 還處于 Alpha 階段,下一個(gè) Release 也就是 0.5 Release 是 Beta 版本。在 Ozone 項(xiàng)目上,騰訊的工程師也做出了很多的貢獻(xiàn),比如像 Topology Awareness(拓?fù)涓兄?、性能?yōu)化等等。
除了剛才提到的大的場(chǎng)景突破,還有一些持續(xù)不斷的改進(jìn)和優(yōu)化,也列在這里,包括:對(duì)于非易失性存儲(chǔ)的支持,對(duì)新的 trace 框架 -opentracing 的支持,以及擴(kuò)展性壓力測(cè)試工具 Dynamometer 等等。
計(jì)算的新功能
下面重點(diǎn)介紹關(guān)于計(jì)算部分(Compute)的更新,主要包括 YARN 和 Submarine。未來(lái),計(jì)算資源會(huì)越來(lái)越多容器化。以前容器化主要是被 DevOps 和微服務(wù)所使用,最近隨著大數(shù)據(jù)應(yīng)用的依賴越來(lái)越復(fù)雜,我們也需要用容器化做更好的依賴管理和資源隔離。
下面是一些重點(diǎn)的計(jì)算方面新的功能。
第一個(gè)功能是 YARN-5139 Global Scheduling Framework。這是在 3.0.0 里加入的功能,它可以每次看多個(gè)節(jié)點(diǎn),里面加入了一些 Ability 優(yōu)化,就算只有一個(gè) Thread 情況下都可以跑得比較快。另外它加入了多個(gè) allocation threads,可以在并行狀態(tài)下進(jìn)行 allocate。經(jīng)過(guò)一些模擬測(cè)試可以看到很多場(chǎng)景下達(dá)到 5-10 倍的 allocation throughput,現(xiàn)在到每秒鐘 3000、4000 個(gè) Container 的 allocation 是比較正常通過(guò)測(cè)試的數(shù)值。當(dāng)然,實(shí)際可能會(huì)有些出入,如果有更較精確的數(shù)字,希望大家在社區(qū)里跟我們溝通。
對(duì)于 Containerization,下面是相關(guān)的 Improvement。第一個(gè)是在 3.1.0 里已經(jīng)說(shuō) Docker container 是 Ready for production;3.2 和 3.3 也有很多功能和穩(wěn)定化的東西。3.3 第一個(gè)功能是支持 Interactive Docker Shell,用戶可以登陸到你的 Docker container 里 Run 一些命令,不用去 SSH 到對(duì)應(yīng)的節(jié)點(diǎn),這樣比較方便調(diào)試。第二塊是 OCI/squashfs(Like runc)的支持。這邊的趨勢(shì)是大家很多不希望用 Docker container,希望用其他的 runtime。OCI 和 Squashfs 是對(duì)應(yīng)的標(biāo)準(zhǔn),社區(qū)在比較積極的推進(jìn)。大部分 Test 都已經(jīng)有 Patch,應(yīng)該可以在 3.3 里出現(xiàn)。第三塊是 Docker image localization 和相關(guān)的 Improvement。以前 YARN 破 Image 時(shí)不太清楚知道到底鋪了多少。這塊可以幫助用戶了解當(dāng) Docker image 比較大時(shí)到底進(jìn)度是怎么樣的。
在 YARN+Cloud 的環(huán)境下,也有一些對(duì)應(yīng)的改進(jìn)。這部分改進(jìn)目前還在不斷進(jìn)行中,希望大家多提提需求,看看對(duì)應(yīng)的場(chǎng)景是什么。第一塊是 Auto scaling,在云上做擴(kuò)容、縮容的工作;第二塊是做更好的 Scheduling,比如把 Container 能 pack 到盡量小的漏斗。第三塊,比如 Spot instances,當(dāng)出現(xiàn)一些 Spot instances 時(shí)怎么做 allocation,保證盡量少對(duì)好的 Job 帶來(lái)影響。云上經(jīng)常會(huì)出現(xiàn)有些時(shí)候漏斗突然不可用的情況,相對(duì)私有的數(shù)據(jù)中心來(lái)講,這條相對(duì)更容易出現(xiàn)。這塊也要知道怎么更好的做 Decommissioning,還有就是對(duì)于 Services data 的處理。
這塊場(chǎng)景下大家如果有什么想法或者在云上已經(jīng)有了一些工作,可以到 YARN-9548 上評(píng)論。
機(jī)器學(xué)習(xí)這塊的工作主要是 Submarine。Submarine 是 3.2.0 第一次加入到 Hadoop 里作為 YARN 的子項(xiàng)目。在今年早些時(shí)間,我們把它剝離成在 Hadoop 下的子項(xiàng)目,跟 YARN 和 HDFS 是平級(jí)的。之后我們也做了一個(gè) Release0.2.0,0.3.0 里還有很多新的東西。
下圖是社區(qū)的 Release Plan:
先回顧一下 2018 年的 Release。2018 年做了 2.6、2.7、2.8 的 Maintenance Release,2.9 是一個(gè)新的 Release,做了關(guān)于 YARN Federation 和 Optimistic Container,這兩塊都是由微軟去做的。3.0 加入了 EC、全局調(diào)度器、Resource types、Timeline V2,3.1 加入了 GPU/FPGA、YARN Service、Placement Constraint 可以做一些相關(guān)工作。
2019 年到目前為止做了兩個(gè) Release。3.1.2 是一個(gè) Stabilization Release,3.2 加入了 Node Attribute,可以去 Tach,Node 可以在調(diào)度時(shí)做相應(yīng)調(diào)度,也加入了 Submarine、HDFS 的 SPS,云的 Connector 上也有一些比較大的 Improvement。
今年剩下的四個(gè)月準(zhǔn)備多做幾個(gè) Release。第一個(gè)是 2.8.6 社區(qū),很希望能做一些 Maintenance Patch,3.1.3 和 3.2.1 也準(zhǔn)備做兩個(gè) Maintenaece Release,剛剛介紹的很多關(guān)于 HDFS 和 Hadoop 社區(qū)的一些工作,像 Federation、Opentracing,這塊大部分功能都準(zhǔn)備放到 3.3 里,還有剛剛提到的一些關(guān)于 Docker container 等等功能?,F(xiàn)在在 3.3 里的 Patch 已經(jīng)有 1000 多個(gè),整個(gè) Hadoop 社區(qū)都在全力準(zhǔn)備盡早把這個(gè)版本 Release 出去。
作者介紹:
堵俊平,來(lái)自騰訊,在騰訊大數(shù)據(jù)負(fù)責(zé)海量存儲(chǔ)和海量計(jì)算。之前是 Apache Hadoop 社區(qū)的 Committer 和 PMC,同時(shí)也是 Apache 基金會(huì)的 Member。
譚望達(dá),來(lái)自 Cloudera,負(fù)責(zé)計(jì)算平臺(tái),也是 Hadoop 社區(qū)的 Committer 和 PMC。