HDFS集群是主從架構(gòu),它由一臺(tái)Namenode節(jié)點(diǎn)(Master)和多臺(tái)Datanode節(jié)點(diǎn)(Slaver)構(gòu)成。Namenode節(jié)點(diǎn)和Datanode節(jié)點(diǎn)都是標(biāo)準(zhǔn)的x86。Datanode節(jié)點(diǎn)采用DAS存儲(chǔ)的方式,即x86內(nèi)置多塊大容量硬盤,Datanode節(jié)點(diǎn)可以多達(dá)上千臺(tái)。
HDFS通常用于存儲(chǔ)大文件,在HDFS中每個(gè)文件都被切割為固定大小的數(shù)據(jù)塊,然后被分散存放于多臺(tái)Datanode的硬盤上。并且每個(gè)數(shù)據(jù)塊都會(huì)有副本存放于遠(yuǎn)端機(jī)架的Datanode上,副本數(shù)一般設(shè)置為三個(gè)。Namenode節(jié)點(diǎn)不存放實(shí)際的文件,而只存放整個(gè)文件系統(tǒng)的目錄樹(shù)等元數(shù)據(jù)。當(dāng)客戶端需要訪問(wèn)存儲(chǔ)于HDFS的某個(gè)文件時(shí),首先需要訪問(wèn)Namenode節(jié)點(diǎn),以取得文件存放的位置信息(哪幾臺(tái)Datanode,以及在 Datanode硬盤上的具體地址),然后根據(jù)這些目的地址對(duì)各Datanode上存放的數(shù)據(jù)并行地進(jìn)行訪問(wèn)。
HDFS的這種分布式存儲(chǔ)架構(gòu),主要有幾個(gè)好處:1、當(dāng)存儲(chǔ)空間不夠時(shí),只要簡(jiǎn)單增加Datanode節(jié)點(diǎn),而系統(tǒng)自動(dòng)會(huì)把數(shù)據(jù)塊分配到新Datanode節(jié)點(diǎn)上,而無(wú)需人工干預(yù)。從而使得Hadoop集群存儲(chǔ)的擴(kuò)展性非常好。2、當(dāng)客戶訪問(wèn)某一文件時(shí),由于該文件存放于多臺(tái)設(shè)備上,因此是由多臺(tái)Datanode并行處理的,這樣大大增加了整個(gè)系統(tǒng)的吞吐量。3、HDFS的數(shù)據(jù)都有多個(gè)副本,HDFS 系統(tǒng)在后臺(tái)自動(dòng)檢測(cè)數(shù)據(jù)的一致性,并能在發(fā)生錯(cuò)誤時(shí),自動(dòng)恢復(fù)數(shù)據(jù),因此系統(tǒng)有很好的可用性。4、由于Hadoop中硬盤是順序讀寫(xiě)的,因此讀寫(xiě)硬盤的性能很好。
但是需要注意的是:Namenode節(jié)點(diǎn)為了加快對(duì)客戶端的響應(yīng)速度,是把文件目錄樹(shù)等元數(shù)據(jù)緩存于主內(nèi)存中的,因此整個(gè)文件系統(tǒng)的容量受限于Namenode節(jié)點(diǎn)的內(nèi)存大小,所以說(shuō)理論上Hadoop集群的擴(kuò)展性也并非無(wú)限的,但相對(duì)于傳統(tǒng)存儲(chǔ)系統(tǒng),Hadoop的容量已經(jīng)很大了,據(jù)說(shuō)目前Facebook已經(jīng)有容量超過(guò)100PB的HDFS集群。
Hadoop Map/Reduce是一個(gè)使用簡(jiǎn)易的軟件框架,基于它寫(xiě)出來(lái)的應(yīng)用程序能夠運(yùn)行在由上千個(gè)商用機(jī)器組成的大型集群上,并以一種可靠容錯(cuò)的方式并行處理上T級(jí)別的數(shù)據(jù)集。
一個(gè)Map/Reduce 作業(yè)(job) 通常會(huì)把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,由 map任務(wù)(task)以完全并行的方式處理它們??蚣軙?huì)對(duì)map的輸出先進(jìn)行排序, 然后把結(jié)果輸入給reduce任務(wù)。通常作業(yè)的輸入和輸出都會(huì)被存儲(chǔ)在文件系統(tǒng)中。 整個(gè)框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控,以及重新執(zhí)行已經(jīng)失敗的任務(wù)。
通常,Map/Reduce框架和分布式文件系統(tǒng)是運(yùn)行在一組相同的節(jié)點(diǎn)上的,也就是說(shuō),計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)通常在一起。這種配置允許框架在那些已經(jīng)存好數(shù)據(jù)的節(jié)點(diǎn)上高效地調(diào)度任務(wù),這可以使整個(gè)集群的網(wǎng)絡(luò)帶寬被非常高效地利用。
Map/Reduce框架由一個(gè)單獨(dú)的master JobTracker 和每個(gè)集群節(jié)點(diǎn)一個(gè)slave TaskTracker共同組成。master負(fù)責(zé)調(diào)度構(gòu)成一個(gè)作業(yè)的所有任務(wù),這些任務(wù)分布在不同的slave上,master監(jiān)控它們的執(zhí)行,重新執(zhí)行已經(jīng)失敗的任務(wù)。而slave僅負(fù)責(zé)執(zhí)行由master指派的任務(wù)。
這張是Hadoop的MapReduce任務(wù)調(diào)度圖:
這張是MapReduce的工作機(jī)制圖
MapReduce簡(jiǎn)單的理解,就是Master節(jié)點(diǎn)(Jobtracker)把客戶端提交的任務(wù),分割成很多個(gè)小任務(wù),然后交給各Datanode節(jié)點(diǎn)(TaskTracker)并行執(zhí)行Map,Reduce計(jì)算,最終提交給客戶一個(gè)完整的結(jié)果。
我認(rèn)為MapReduce有幾個(gè)非常重要的的特點(diǎn):1多節(jié)點(diǎn)并行計(jì)算,2大量需要計(jì)算的數(shù)據(jù)在本地,只有計(jì)算產(chǎn)生的中間結(jié)果或結(jié)果才在網(wǎng)絡(luò)里傳輸,大大減少了網(wǎng)絡(luò)流量。
最后再簡(jiǎn)單介紹下Hadoop HBase和Hive。
HBase是構(gòu)架于HDFS之上的面向列的實(shí)時(shí)分布式數(shù)據(jù)庫(kù)(非關(guān)系型),HBase 的設(shè)計(jì)目的之一是支持高并發(fā)用戶數(shù)的高速讀寫(xiě)訪問(wèn)。這是通過(guò)兩方面來(lái)實(shí)現(xiàn)的。首先數(shù)據(jù)行被水平切分并分布到多臺(tái)服務(wù)器上,在大量用戶訪問(wèn)時(shí),訪問(wèn)請(qǐng)求也被分散到了不同的服務(wù)器上,雖然每個(gè)服務(wù)器的服務(wù)能力有限,但是數(shù)千臺(tái)服務(wù)器匯總后可以提供極高性能的訪問(wèn)能力。其次,HBase 設(shè)計(jì)了高效的緩存機(jī)制,有效提高了訪問(wèn)的命中率,提高了訪問(wèn)性能。
Hive 是一種建立在Hadoop 之上的數(shù)據(jù)倉(cāng)庫(kù)架構(gòu)。它提供了:
• 一套方便的實(shí)施數(shù)據(jù)抽取(ETL)的工具。
• 一種讓用戶對(duì)數(shù)據(jù)描述其結(jié)構(gòu)的機(jī)制。
• 支持用戶對(duì)存儲(chǔ)在Hadoop 中的海量數(shù)據(jù)進(jìn)行查詢和分析的能力。
Hive 的基本特點(diǎn)是它采用HDFS 進(jìn)行數(shù)據(jù)存儲(chǔ)并利用MapReduce 框架進(jìn)行數(shù)據(jù)操作。所以從本質(zhì)上來(lái)說(shuō),Hive 就是個(gè)編譯器,它把用戶的操作(查詢或者ETL)變換成MapReduce任務(wù),利用MapReduce 框架執(zhí)行這些任務(wù)以對(duì)HDFS 上的海量數(shù)據(jù)進(jìn)行處理。
Hive 定義了一種簡(jiǎn)單的類SQL 查詢語(yǔ)言HiveQL,讓熟悉SQL 的用戶可以非常容易的進(jìn)行查詢。與此同時(shí),HiveQL 也允許熟悉MapReduce 框架的程序員在查詢中插入自定義的mapper和reducer 腳本以擴(kuò)展Hive 內(nèi)嵌的功能,完成更復(fù)雜的分析。
二、Oracle Exadata架構(gòu)
介紹完Hadoop 后,我們?cè)賮?lái)看一下Oracle Exadata的架構(gòu):
如圖中所示,Oracle Exadata是由計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)構(gòu)成,圖上層為計(jì)算節(jié)點(diǎn),下層為存儲(chǔ)節(jié)點(diǎn),計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)均為X86服務(wù)器,存儲(chǔ)節(jié)點(diǎn)是X86服務(wù)器直聯(lián)存儲(chǔ)(DAS)的設(shè)計(jì),計(jì)算節(jié)點(diǎn)可以作Oracle RAC(HA,負(fù)載均衡,并行計(jì)算),計(jì)算節(jié)點(diǎn)間互聯(lián)以及計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)間的互聯(lián)都是采用Infiniband(高帶寬,低延遲),而不是傳統(tǒng)的以太網(wǎng)。整個(gè)系統(tǒng)中網(wǎng)絡(luò)部分都有冗余,設(shè)計(jì)為無(wú)單點(diǎn)故障。
計(jì)算節(jié)點(diǎn)本身不存放數(shù)據(jù),它通過(guò)ASM模塊訪問(wèn)存放于存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù),Oracle 的ASM是Oracle公司自己的自動(dòng)存儲(chǔ)管理軟件,特別需要注意的是:ASM是Oracle Exadata架構(gòu)非常核心的部分,本文主要討論的就是Exadata中的ASM以及Smart Scan(Offloading)技術(shù),其它如Smart flashcache,Storageindex,HCC等特性,本文不作討論。
由于Oracle的文檔中對(duì)于Exadata中ASM技術(shù)細(xì)節(jié)的描述不多,因此本文中有些觀點(diǎn)是我本人的猜測(cè),如有謬誤,敬請(qǐng)諒解。
以下有關(guān)ASM的資料很多來(lái)自于《Oracle+Database+11g+RAC手冊(cè)(第2版)》一書(shū)
ASM與Oracle 數(shù)據(jù)庫(kù)緊密集成在一起,并對(duì)其進(jìn)行優(yōu)化。它是通過(guò)3 個(gè)關(guān)鍵組件實(shí)現(xiàn)的:ASM 實(shí)例、ASM 動(dòng)態(tài)卷管理器(ADVM)和ASM 集群文件系統(tǒng)(ACFS)。ASM 動(dòng)態(tài)卷管理器為ASM 集群文件系統(tǒng)提供了卷管理器功能。
ASM可以擁有63 個(gè)磁盤組,其中放置10 000 個(gè)ASM 磁盤,每個(gè)ASM 磁盤可以存儲(chǔ)高達(dá)2TB數(shù)據(jù)。一個(gè)磁盤組可處理100 萬(wàn)個(gè)ASM 文件。在Oracle Database 11g 中,一個(gè)數(shù)據(jù)文件所支持的最大文件大小為128TB,而ASM 在采用外部冗余時(shí)支持高達(dá)140PB 數(shù)據(jù)??梢?jiàn)ASM所能管理的存儲(chǔ)空間也在100PB的量級(jí)。
以下是Oracle在使用ASM前后的架構(gòu)對(duì)比:
Exadata使用ASM管理所有智能存儲(chǔ)節(jié)點(diǎn)上的硬盤,它首先把所有存儲(chǔ)節(jié)點(diǎn)的磁盤放到一個(gè)資源池里,并形成ACFS集群文件系統(tǒng),然后應(yīng)用 Stripe And Mirror Everything技術(shù)把需要存儲(chǔ)的所有數(shù)據(jù)文件分割成固定大小的塊,均勻的分布到各存儲(chǔ)節(jié)點(diǎn)的硬盤上,并可以對(duì)數(shù)據(jù)塊設(shè)定副本的數(shù)量,常規(guī)是雙重副本,高級(jí)是3重副本。副本通常也會(huì)被放置于其他存儲(chǔ)節(jié)點(diǎn)的硬盤上。因此當(dāng)計(jì)算節(jié)點(diǎn)需要訪問(wèn)某個(gè)數(shù)據(jù)文件時(shí),也是需要到多個(gè)存儲(chǔ)節(jié)點(diǎn)上并行讀取。從這點(diǎn)上看起來(lái),ASM在文件分割和副本方面的策略是否與HDFS的思路很象?不同的是Oracle ASM一般設(shè)數(shù)據(jù)塊大小為128K或1M,而HDFS一般設(shè)為64M。
在Exadata存儲(chǔ)容量不夠時(shí),也可以在線添加存儲(chǔ)節(jié)點(diǎn),ASM在存儲(chǔ)配置和再配置期間,不需要任何停機(jī)時(shí)間,也就是說(shuō),在改變存儲(chǔ)配置時(shí)不需要使數(shù)據(jù)庫(kù)脫機(jī)。在磁盤組中添加或刪除磁盤之后,ASM 會(huì)自動(dòng)在磁盤組的所有磁盤之間均勻地再分布文件數(shù)據(jù)。這個(gè)操作稱為“磁盤再均衡”,它對(duì)數(shù)據(jù)庫(kù)是透明的。但Oracle Exadata對(duì)存儲(chǔ)節(jié)點(diǎn)的添加是有要求的,它每次擴(kuò)容最少需要擴(kuò)1/4機(jī)架,也就是4個(gè)存儲(chǔ)節(jié)點(diǎn)。目前Exadata最大容量只支持最大8個(gè)機(jī)架,但我相信是由于交換機(jī)硬件架構(gòu)的限制,而不是ASM本身的限制。
討論到現(xiàn)在再回頭看看,Hadoop Hbase是構(gòu)架于HDFS上的Nosql數(shù)據(jù)庫(kù),Exadata則是構(gòu)建于ASM上的oracle數(shù)據(jù)庫(kù),此外Exadata使用的ASM和HDFS是有很多相似的地方。前面我總結(jié)的HDFS的4個(gè)主要特點(diǎn)中,可擴(kuò)展性,多磁盤并發(fā)工作,高可用這三個(gè)特性,在Exadata中都有類似的實(shí)現(xiàn)方式。
由于ASM的資料較少,我不是很清楚Exadata中ASM的元數(shù)據(jù)的管理方式,因?yàn)閺腅xadata的架構(gòu)上看,沒(méi)有類似于HDFS的 Namenode的角色,因此ACFS肯定不是采用集中式元數(shù)據(jù)服務(wù)模型。我也曾請(qǐng)教過(guò)別人,有人說(shuō)是采用類似GlusterFS的彈性Hash技術(shù),另外有人說(shuō)是采用分布式元數(shù)據(jù)服務(wù)模型,但我從Oracle的文檔上看到,元數(shù)據(jù)是存放在每個(gè)智能存儲(chǔ)節(jié)點(diǎn)上的,因此我更傾向于后者。這個(gè)需要熟悉 Oracle的高手解惑!
最后再來(lái)看一下Exadata的另一個(gè)主要特性Smart Scan(Offloading)
下圖是Smart Scan(Offloading)的工作示意圖:
1、客戶端向數(shù)據(jù)庫(kù)計(jì)算節(jié)點(diǎn)發(fā)出了一個(gè) SELECT 語(yǔ)句,帶有謂詞,要求過(guò)濾并僅返回所需行。
2、計(jì)算節(jié)點(diǎn)數(shù)據(jù)庫(kù)內(nèi)核確定存儲(chǔ)節(jié)點(diǎn)可用,并構(gòu)造一個(gè)代表發(fā)出的 SQL 命令的iDB 命令,并將其發(fā)送到各存儲(chǔ)節(jié)點(diǎn)。
3、存儲(chǔ)節(jié)點(diǎn)的 CELLSRV 組件掃描數(shù)據(jù)塊以識(shí)別哪些行和列滿足發(fā)出的SQL。
4、存儲(chǔ)節(jié)點(diǎn)只將滿足謂詞的行和請(qǐng)求的列返回給計(jì)算節(jié)點(diǎn)。
5、計(jì)算節(jié)點(diǎn)數(shù)據(jù)庫(kù)內(nèi)核整合各個(gè) Exadata 單元的結(jié)果集。
6、最后,將查找到的行返回給客戶端。
簡(jiǎn)單的說(shuō),Exadata的Smart Scan工作模式就是:當(dāng)計(jì)算節(jié)點(diǎn)接到客戶端任務(wù)時(shí),它就把任務(wù)下發(fā)給各個(gè)存儲(chǔ)節(jié)點(diǎn),各存儲(chǔ)節(jié)點(diǎn)計(jì)算完后再把結(jié)果返還給計(jì)算節(jié)點(diǎn),最后由計(jì)算節(jié)點(diǎn)整合成完整結(jié)果集,再返回給客戶。
思考一下Exadata的這個(gè)特性是否和MapReduce中的Jobtracker,Tasktracker的工作模式很象?都是Master接到客戶端任務(wù)后,把任務(wù)分解成多個(gè)小任務(wù),然后由多臺(tái)Slave并行計(jì)算,最終把匯總結(jié)果返還給客戶端。由此是否可以說(shuō)Exadata的Smart Scan(Offloading)技術(shù)也符合前文總結(jié)的MapReduce的兩個(gè)重要特性:1、多節(jié)點(diǎn)并行計(jì)算,2、大量需要計(jì)算的數(shù)據(jù)在本地,只有計(jì)算產(chǎn)生的中間結(jié)果或結(jié)果才在網(wǎng)絡(luò)里傳輸,大大減少了網(wǎng)絡(luò)流量。
前文介紹過(guò),HBase和Hive都是通過(guò)很多節(jié)點(diǎn)并行作MapReduce計(jì)算,來(lái)提高整體系統(tǒng)的吞吐量從而海量數(shù)據(jù)的查詢和分析能力,其實(shí) Exadata也采用類似的架構(gòu),區(qū)別就是存儲(chǔ)節(jié)點(diǎn)上不是跑MapReduce,而是跑SQL而已。但不可否認(rèn)的是Hadoop支持成千上萬(wàn)個(gè)節(jié)點(diǎn)的集群,而目前Exadata只支持8個(gè)機(jī)柜,因此從擴(kuò)展性方面,還是無(wú)法和Hadoop集群比。
綜上所述,其實(shí)Exadata借鑒了分布式計(jì)算的很多優(yōu)點(diǎn),它把RDBMS構(gòu)建于分布式集群存儲(chǔ)之上,從而使得RDBMS具備了更好的擴(kuò)展性,此外它還吸取了眾多類似于Flash,Infiniband,列式數(shù)據(jù)庫(kù)等新技術(shù)的特點(diǎn),并將這些技術(shù)完美的融合在一起。不可否認(rèn),Oracle的Exadata是關(guān)系型數(shù)據(jù)庫(kù)領(lǐng)域里偉大的革新性產(chǎn)品。
關(guān)于Oracle 數(shù)據(jù)庫(kù),Exadata,RAC,ASM,ACFS等技術(shù),有非常多的內(nèi)容,而我也是在開(kāi)始學(xué)習(xí)的過(guò)程中,本文只是我在學(xué)習(xí)過(guò)程中的一些總結(jié)和感想,我覺(jué)得計(jì)算機(jī)技術(shù)中很多都是相通的,當(dāng)一個(gè)領(lǐng)域里有好的技術(shù)發(fā)布之后,其他領(lǐng)域的技術(shù)人員會(huì)迅速學(xué)習(xí)并借鑒這些技術(shù),從而推動(dòng)自己領(lǐng)域的技術(shù)發(fā)展,這也是信息技術(shù)在這些年里飛速發(fā)展的原因!