為什么要構(gòu)建數(shù)據(jù)湖
大數(shù)據(jù)時(shí)代早期,Apache HDFS是構(gòu)建具有海量存儲(chǔ)能力數(shù)據(jù)倉(cāng)庫(kù)的首選方案。隨著云計(jì)算、大數(shù)據(jù)、AI等技術(shù)的發(fā)展,所有云廠商都在不斷完善自家的對(duì)象存儲(chǔ),來(lái)更好地適配Apache Hadoop/Spark大數(shù)據(jù)以及各種AI生態(tài)。由于對(duì)象存儲(chǔ)有海量、安全、低成本、高可靠、易集成等優(yōu)勢(shì),各種IoT設(shè)備、網(wǎng)站數(shù)據(jù)都把各種形式的原始文件存儲(chǔ)在對(duì)象存儲(chǔ)上,利用對(duì)象存儲(chǔ)增強(qiáng)和拓展大數(shù)據(jù)AI也成為了業(yè)界共識(shí),Apache Hadoop社區(qū)也推出了原生的對(duì)象存儲(chǔ)“Ozone”。從HDFS到對(duì)象存儲(chǔ),從數(shù)據(jù)倉(cāng)庫(kù)到數(shù)據(jù)湖,把所有的數(shù)據(jù)都放在一個(gè)統(tǒng)一的存儲(chǔ)中,也可以更加高效地進(jìn)行分析和處理。
對(duì)于云上的客戶來(lái)說(shuō),如何構(gòu)建自己的數(shù)據(jù)湖,早期的技術(shù)選型非常重要,隨著數(shù)據(jù)量的不斷增加,后續(xù)進(jìn)行架構(gòu)升級(jí)和數(shù)據(jù)遷移的成本也會(huì)增加。在云上使用HDFS構(gòu)建大規(guī)模存儲(chǔ)系統(tǒng),已經(jīng)暴露出來(lái)不少問(wèn)題。HDFS是Hadoop原生的存儲(chǔ)系統(tǒng),經(jīng)過(guò)10年來(lái)的發(fā)展,HDFS已經(jīng)成為大數(shù)據(jù)生態(tài)的存儲(chǔ)標(biāo)準(zhǔn),但我們也看到HDFS雖然不斷優(yōu)化,但是NameNode單點(diǎn)瓶頸,JVM瓶頸仍然影響著集群的擴(kuò)展,從1 PB到100+PB,需要不斷的進(jìn)行調(diào)優(yōu)、集群拆分來(lái),HDFS可以支持到EB級(jí)別,但是投入很高的運(yùn)維成本,來(lái)解決慢啟動(dòng),心跳風(fēng)暴,節(jié)點(diǎn)擴(kuò)容、節(jié)點(diǎn)遷移,數(shù)據(jù)平衡等問(wèn)題。
云原生的大數(shù)據(jù)存儲(chǔ)方案,基于阿里云OSS構(gòu)建數(shù)據(jù)湖是最合適的選擇。OSS是阿里云上的對(duì)象存儲(chǔ)服務(wù),有著高性能、無(wú)限容量、高安全、高可用、低成本等優(yōu)勢(shì),JindoFS針對(duì)大數(shù)據(jù)生態(tài)對(duì)OSS進(jìn)行了適配,緩存加速,甚至提供專門的文件元數(shù)據(jù)服務(wù),滿足上云客戶的各種分析計(jì)算需求。因此在阿里云上,JindoFS+OSS成為客戶采取數(shù)據(jù)湖架構(gòu)遷移上云的最佳實(shí)踐。
JindoFS介紹
Jindo是阿里云基于Apache Spark/Apache Hadoop在云上定制的分布式計(jì)算和存儲(chǔ)引擎。Jindo原是阿里云開(kāi)源大數(shù)據(jù)團(tuán)隊(duì)的內(nèi)部研發(fā)代號(hào),取自筋斗(云)的諧音,Jindo在開(kāi)源基礎(chǔ)上做了大量?jī)?yōu)化和擴(kuò)展,深度集成和連接了眾多阿里云基礎(chǔ)服務(wù)。
JindoFS是阿里云針對(duì)云上存儲(chǔ)自研的大數(shù)據(jù)緩存加速服務(wù),JindoFS的設(shè)計(jì)理念是云原生:彈性、高效、穩(wěn)定和低成本。JindoFS完全兼容Hadoop文件系統(tǒng)接口,給客戶帶來(lái)更加靈活、高效的數(shù)據(jù)湖加速方案,完全兼容阿里云EMR中所有的計(jì)算服務(wù)和引擎:Spark、Flink、Hive、MapReduce、Presto、Impala等。JindoFS有兩種使用模式,塊存儲(chǔ)模式(BLOCK)和緩存模式(CACHE)。下面我們介紹下如何在EMR中配置和使用JindoFS以及不同模式對(duì)應(yīng)的場(chǎng)景。
JindoFS架構(gòu)
JindoFS主要包含兩個(gè)服務(wù)組件:元數(shù)據(jù)服務(wù)(NamespaceService)和存儲(chǔ)服務(wù)(StorageService):
NamespaceService主要負(fù)責(zé)元數(shù)據(jù)管理以及管理StorageService。
StorageService主要負(fù)責(zé)管理節(jié)點(diǎn)的本地?cái)?shù)據(jù)和OSS上的緩存數(shù)據(jù)。
下圖是JindoFS架構(gòu)圖:元數(shù)據(jù)服務(wù)NamespaceService部署在獨(dú)立的節(jié)點(diǎn),對(duì)于生產(chǎn)環(huán)境推薦部署三臺(tái)(Raft)來(lái)實(shí)現(xiàn)服務(wù)高可用;存儲(chǔ)服務(wù)StorageService部署在集群的計(jì)算節(jié)點(diǎn),管理節(jié)點(diǎn)上的閑置存儲(chǔ)資源(本地盤/SSD/內(nèi)存等),為JindoFS提供分布式緩存能力。
JindoFS元數(shù)據(jù)服務(wù)
JindoFS的元數(shù)據(jù)服務(wù)叫JindoNamespaceService,內(nèi)部基于K-V結(jié)構(gòu)存儲(chǔ)元數(shù)據(jù),相對(duì)于傳統(tǒng)的內(nèi)存結(jié)構(gòu)有著操作高效,易管理,易恢復(fù)等優(yōu)勢(shì)。
高效元數(shù)據(jù)操作。JindoFS NamespaceService基于內(nèi)存+磁盤管理和存儲(chǔ)元數(shù)據(jù),但是性能上比使用內(nèi)存的HDFS NameNode還要好,一方面是JindoFS使用C++開(kāi)發(fā),沒(méi)有GC等問(wèn)題,響應(yīng)更快;另一方面是由于Namespace Service內(nèi)部有更好的設(shè)計(jì),比如文件元數(shù)據(jù)上更細(xì)粒度的鎖,更高效的數(shù)據(jù)塊副本管理機(jī)制。
秒級(jí)啟動(dòng)。有大規(guī)模HDFS集群維護(hù)經(jīng)驗(yàn)的同學(xué)比較清楚,當(dāng)HDFS元數(shù)據(jù)存儲(chǔ)量過(guò)億以后,NameNode啟動(dòng)初始化要先加載Fsimage,再合并edit log,然后等待全部DataNode上報(bào)Block,這一系列流程完成要花費(fèi)一個(gè)小時(shí)甚至更長(zhǎng)的時(shí)間,由于NameNode是雙機(jī)高可用(Active/Standby),如果standby節(jié)點(diǎn)重啟時(shí)active節(jié)點(diǎn)出現(xiàn)異常,或兩臺(tái)NameNode節(jié)點(diǎn)同時(shí)出現(xiàn)故障,HDFS將出現(xiàn)停服一小時(shí)以上的損失。JindoFS的元數(shù)據(jù)服務(wù)基于Raft實(shí)現(xiàn)高可用,支持2N+1的部署方式,允許同時(shí)掛掉N臺(tái);元數(shù)據(jù)服務(wù)(NamespaceService)在元數(shù)據(jù)內(nèi)部存儲(chǔ)上進(jìn)行了設(shè)計(jì)和優(yōu)化,進(jìn)程啟動(dòng)后即可提供服務(wù),可以做到了快速響應(yīng)。由于NamespaceService近實(shí)時(shí)寫入OTS的特點(diǎn),元數(shù)據(jù)節(jié)點(diǎn)更換,甚至集群整體遷移也非常容易。
低資源消耗。HDFS NameNode采用內(nèi)存形式來(lái)存儲(chǔ)文件元數(shù)據(jù)。在一定規(guī)模下,這種做法性能上是比較不錯(cuò)的,但是這樣的做法也使HDFS元數(shù)據(jù)的規(guī)模受限于節(jié)點(diǎn)的內(nèi)存,經(jīng)過(guò)推算,1億文件HDFS文件大約需要分配60 GB Java Heap給NameNode,所以一臺(tái)256 GB的機(jī)器最多可以管理4億左右的元數(shù)據(jù),同時(shí)還需要不斷調(diào)優(yōu)JVM GC。JindoFS的元數(shù)據(jù)采用Rocksdb存儲(chǔ)元數(shù)據(jù),可以輕松支持到10億規(guī)模,對(duì)于節(jié)點(diǎn)的內(nèi)存需求也非常小,資源開(kāi)銷不到NameNode的十分之一。
JindoFS緩存服務(wù)
JindoFS的數(shù)據(jù)緩存服務(wù)叫JindoStorageService,本地StorageService主要提供高性能緩存加速,所以運(yùn)維上可以基于這樣的設(shè)定大大簡(jiǎn)化。
彈性運(yùn)維。HDFS使用DataNode在存儲(chǔ)節(jié)點(diǎn)上來(lái)管理節(jié)點(diǎn)存儲(chǔ),全部數(shù)據(jù)塊都存儲(chǔ)在節(jié)點(diǎn)的磁盤上,依靠DataNode定期檢查和心跳把存儲(chǔ)狀態(tài)上報(bào)給NameNode,NameNode通過(guò)匯總和計(jì)算,動(dòng)態(tài)地保證文件的數(shù)據(jù)塊達(dá)到設(shè)定的副本數(shù)(一般3副本)。對(duì)于大規(guī)模集群(節(jié)點(diǎn)1000+),經(jīng)常需要進(jìn)行集群節(jié)點(diǎn)擴(kuò)容,節(jié)點(diǎn)遷移,節(jié)點(diǎn)下線,節(jié)點(diǎn)數(shù)據(jù)平衡這樣的操作,大量的數(shù)據(jù)塊的副本計(jì)算增加了NameNode負(fù)載,同時(shí),節(jié)點(diǎn)相關(guān)操作要等待NameNode內(nèi)部的副本調(diào)度完成才能進(jìn)行,通常一個(gè)存儲(chǔ)節(jié)點(diǎn)的下線需要小時(shí)級(jí)別的等待才能完成。JindoFS使用StorageService來(lái)管理節(jié)點(diǎn)上的存儲(chǔ),由于JindoFS保證了數(shù)據(jù)在OSS上有一副本,所以本地的副本主要用來(lái)進(jìn)行緩存加速。對(duì)于節(jié)點(diǎn)遷移、節(jié)點(diǎn)下線等場(chǎng)景,JindoFS無(wú)需復(fù)雜副本計(jì)算,通過(guò)快速的“標(biāo)記”即可完成下線。
高性能存儲(chǔ)。StorageService采用C++語(yǔ)言開(kāi)發(fā),在對(duì)接最新高性能存儲(chǔ)硬件上也有著天然優(yōu)勢(shì)。StorageService的存儲(chǔ)后端不僅可以同時(shí)對(duì)接SSD、本磁盤、OSS滿足Hadoop/Spark大數(shù)據(jù)框架各種海量、高性能的存儲(chǔ)訪問(wèn)需求,可以對(duì)接內(nèi)存、AEP這樣的高性能設(shè)備滿足AI/機(jī)器學(xué)習(xí)的低延時(shí)、高吞吐的存儲(chǔ)使用需求。
JindoFS適用場(chǎng)景
JindoFS的元數(shù)據(jù)存儲(chǔ)在Master節(jié)點(diǎn)的NamespaceService(高可用部署)上,性能和體驗(yàn)上對(duì)標(biāo)HDFS;Core節(jié)點(diǎn)的StorageService將一份數(shù)據(jù)塊存儲(chǔ)在OSS上,本地?cái)?shù)據(jù)塊可以隨著節(jié)點(diǎn)資源進(jìn)行快速的彈性伸縮。多集群之間也可以相互打通。
為了支持?jǐn)?shù)據(jù)湖多種使用場(chǎng)景,一套JindoFS部署同時(shí)提供兩種OSS使用方式,存儲(chǔ)模式(Block)和緩存模式(Cache)。
緩存模式。對(duì)于已經(jīng)存在于OSS上的數(shù)據(jù),可以使用緩存模式訪問(wèn),正如“緩存”本身的含義,通過(guò)緩存的方式,在本地集群基于JindoFS的存儲(chǔ)能力構(gòu)建了一個(gè)分布式緩存服務(wù),把遠(yuǎn)端數(shù)據(jù)緩存在本地集群,使遠(yuǎn)端數(shù)據(jù)“本地化”。使用上也沿用原來(lái)的路徑訪問(wèn),如oss://bucket1/file1,這種模式全量的文件都在OSS上面,可以做到集群級(jí)別的彈性使用。
存儲(chǔ)模式。存儲(chǔ)模式(Block)適用于高性能數(shù)據(jù)處理場(chǎng)景,元數(shù)據(jù)存儲(chǔ)在NamespaceService(支持高可用部署)上,性能和體驗(yàn)上對(duì)標(biāo)HDFS;StorageService將一份數(shù)據(jù)塊存儲(chǔ)在OSS上,本地?cái)?shù)據(jù)塊可以隨著節(jié)點(diǎn)資源可以進(jìn)行快速的彈性伸縮?;贘indoFS Block模式這樣的特性,可以用作構(gòu)建高性能數(shù)倉(cāng)的核心存儲(chǔ),多個(gè)計(jì)算集群可以訪問(wèn)JindoFS主集群的數(shù)據(jù)。
JindoFS方案優(yōu)勢(shì)
基于JindoFS+OSS來(lái)構(gòu)建數(shù)據(jù)湖相比于其他數(shù)據(jù)湖方案同時(shí)具有性能和成本優(yōu)勢(shì)。
性能上,JindoFS針對(duì)一些常用的場(chǎng)景和Benchmark進(jìn)行了對(duì)比測(cè)試,如DFSIO、NNbench、TPCDS、Spark、Presto等,通過(guò)測(cè)試我們可以看到性能上,Block模式完全領(lǐng)先于HDFS,Cache模式完全領(lǐng)先于Hadoop社區(qū)的OSS SDK實(shí)現(xiàn),由于篇幅的原因,后續(xù)我們會(huì)發(fā)布詳細(xì)的測(cè)試報(bào)告。
成本上。成本是也是用戶上云的重要考量,JindoFS的成本優(yōu)勢(shì)主要體現(xiàn)在運(yùn)維成本和存儲(chǔ)成本兩方面。運(yùn)維成本指的是集群日常維護(hù),節(jié)點(diǎn)上下線、遷移等。如前面分析,當(dāng)HDFS集群增長(zhǎng)到一定規(guī)模時(shí),比如10PB+,除了對(duì)HDFS進(jìn)行專家級(jí)別調(diào)優(yōu)外,還需要業(yè)務(wù)上的拆分規(guī)劃,避免達(dá)到HDFS元數(shù)據(jù)上的瓶頸。同時(shí),隨著集群數(shù)據(jù)不斷增長(zhǎng),一些節(jié)點(diǎn)和磁盤也會(huì)出現(xiàn)故障,需要進(jìn)行節(jié)點(diǎn)下線和數(shù)據(jù)平衡,也給大集群的運(yùn)維帶來(lái)一定的復(fù)雜度。JindoFS可以使用OSS+OTS的存儲(chǔ)模式,OSS上保留原始文件和數(shù)據(jù)塊備份,對(duì)節(jié)點(diǎn)和磁盤出現(xiàn)的問(wèn)題可以更好兼容;元數(shù)據(jù)(NamespaceService)采用C++開(kāi)發(fā)加上工程打磨,相比NameNode+JVM在容量上和性能上也更有優(yōu)勢(shì)。
下面我們重點(diǎn)來(lái)看存儲(chǔ)成本。存儲(chǔ)成本指的是存放數(shù)據(jù)后產(chǎn)生的存儲(chǔ)費(fèi)用,使用OSS是按量付費(fèi)的,相比基于本地盤創(chuàng)建的HDFS集群有更好的成本優(yōu)勢(shì),下面來(lái)計(jì)算和對(duì)比一下二者成本:
基于HDFS+本地盤方案構(gòu)建大數(shù)據(jù)存儲(chǔ):
由于本地盤機(jī)型為整體價(jià)格,需要如下進(jìn)行換算,預(yù)估存儲(chǔ)成本如下:
考慮到實(shí)際使用HDFS會(huì)有3副本以及一定的預(yù)留空間,我們以HDFS 3副本、80%使用率進(jìn)行成本計(jì)算:
基于JindoFS加速方案構(gòu)建數(shù)據(jù)湖:
我們可以看到使用JindoFS加速方案構(gòu)建數(shù)據(jù)湖,要節(jié)省25%的存儲(chǔ)成本。同時(shí)OSS是按量計(jì)費(fèi),即計(jì)算存儲(chǔ)分離,當(dāng)計(jì)算和存儲(chǔ)比例存在差異時(shí),比如存儲(chǔ)資源高速增長(zhǎng),計(jì)算資源增加較小時(shí),成本優(yōu)勢(shì)會(huì)更加明顯。
對(duì)OSS數(shù)據(jù)進(jìn)行緩存加速,需要額外使用計(jì)算節(jié)點(diǎn)上部分磁盤空間,帶來(lái)一定成本。這部分成本,一般取決于熱數(shù)據(jù)或者要緩存數(shù)據(jù)的大小,跟要存儲(chǔ)的數(shù)據(jù)總量關(guān)系不大。增加這部分成本,可以換取計(jì)算效率的提升和計(jì)算資源的節(jié)省,整體效果可以根據(jù)實(shí)際場(chǎng)景進(jìn)行評(píng)估。
JindoFS生態(tài)
數(shù)據(jù)湖是開(kāi)放的,需要對(duì)接各種計(jì)算引擎。目前JindoFS已經(jīng)明確支持Spark、Flink、Hive、MapReduce、Presto和Impala組件。同時(shí),JindoFS為了支持更好地使用數(shù)據(jù)湖,還提供JindoTable對(duì)結(jié)構(gòu)化數(shù)據(jù)進(jìn)行優(yōu)化和查詢加速;提供JindoDistCp來(lái)支持HDFS離線數(shù)據(jù)往OSS遷移;支持JindoFuse方便數(shù)據(jù)湖上加速機(jī)器學(xué)習(xí)訓(xùn)練。