學(xué)習(xí)筆記 Hadoop分布式文件系統(tǒng)中架構(gòu)和設(shè)計(jì)要點(diǎn)
本節(jié)向大家介紹一下Hadoop分布式文件系統(tǒng)中架構(gòu)和設(shè)計(jì)的要點(diǎn),本節(jié)主要從六個(gè)方面來(lái)介紹,歡迎大家一起來(lái)學(xué)習(xí),希望通過(guò)本節(jié)的介紹大家對(duì)Hadoop分布式文件系統(tǒng)有更加深刻的認(rèn)識(shí)。
Hadoop分布式文件系統(tǒng):架構(gòu)和設(shè)計(jì)要點(diǎn)
一、前提和設(shè)計(jì)目標(biāo)
1、硬件錯(cuò)誤是常態(tài),而非異常情況,HDFS可能是有成百上千的server組成,任何一個(gè)組件都有可能一直失效,因此錯(cuò)誤檢測(cè)和快速、自動(dòng)的恢復(fù)是HDFS的核心架構(gòu)目標(biāo)。
2、跑在HDFS上的應(yīng)用與一般的應(yīng)用不同,它們主要是以流式讀為主,做批量處理;比之關(guān)注數(shù)據(jù)訪問(wèn)的低延遲問(wèn)題,更關(guān)鍵的在于數(shù)據(jù)訪問(wèn)的高吞吐量。
3、HDFS以支持大數(shù)據(jù)集合為目標(biāo),一個(gè)存儲(chǔ)在上面的典型文件大小一般都在千兆至T字節(jié),一個(gè)單一HDFS實(shí)例應(yīng)該能支撐數(shù)以千萬(wàn)計(jì)的文件。
4、HDFS應(yīng)用對(duì)文件要求的是write-one-read-many訪問(wèn)模型。一個(gè)文件經(jīng)過(guò)創(chuàng)建、寫,關(guān)閉之后就不需要改變。這一假設(shè)簡(jiǎn)化了數(shù)據(jù)一致性問(wèn)題,使高吞吐量的數(shù)據(jù)訪問(wèn)成為可能。典型的如MapReduce框架,或者一個(gè)webcrawler應(yīng)用都很適合這個(gè)模型。
5、移動(dòng)計(jì)算的代價(jià)比之移動(dòng)數(shù)據(jù)的代價(jià)低。一個(gè)應(yīng)用請(qǐng)求的計(jì)算,離它操作的數(shù)據(jù)越近就越高效,這在數(shù)據(jù)達(dá)到海量級(jí)別的時(shí)候更是如此。將計(jì)算移動(dòng)到數(shù)據(jù)附近,比之將數(shù)據(jù)移動(dòng)到應(yīng)用所在顯然更好,HDFS提供給應(yīng)用這樣的接口。
6、在異構(gòu)的軟硬件平臺(tái)間的可移植性。
二、Namenode和Datanode
Hadoop分布式文件系統(tǒng)HDFS采用master/slave架構(gòu)。一個(gè)HDFS集群是有一個(gè)Namenode和一定數(shù)目的Datanode組成。Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的namespace和客戶端對(duì)文件的訪問(wèn)。Datanode在集群中一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理節(jié)點(diǎn)上它們附帶的存儲(chǔ)。在內(nèi)部,一個(gè)文件其實(shí)分成一個(gè)或多個(gè)block,這些block存儲(chǔ)在Datanode集合里。Namenode執(zhí)行文件系統(tǒng)的namespace操作,例如打開、關(guān)閉、重命名文件和目錄,同時(shí)決定block到具體Datanode節(jié)點(diǎn)的映射。Datanode在Namenode的指揮下進(jìn)行block的創(chuàng)建、刪除和復(fù)制。Namenode和Datanode都是設(shè)計(jì)成可以跑在普通的廉價(jià)的運(yùn)行l(wèi)inux的機(jī)器上。HDFS采用java語(yǔ)言開發(fā),因此可以部署在很大范圍的機(jī)器上。一個(gè)典型的部署場(chǎng)景是一臺(tái)機(jī)器跑一個(gè)單獨(dú)的Namenode節(jié)點(diǎn),集群中的其他機(jī)器各跑一個(gè)Datanode實(shí)例。這個(gè)架構(gòu)并不排除一臺(tái)機(jī)器上跑多個(gè)Datanode,不過(guò)這比較少見(jiàn)。
單一節(jié)點(diǎn)的Namenode大大簡(jiǎn)化了系統(tǒng)的架構(gòu)。Namenode負(fù)責(zé)保管和管理所有的HDFS元數(shù)據(jù),因而用戶數(shù)據(jù)就不需要通過(guò)Namenode(也就是說(shuō)文件數(shù)據(jù)的讀寫是直接在Datanode上)。
三、文件系統(tǒng)的namespace
HDFS支持傳統(tǒng)的層次型文件組織,與大多數(shù)其他文件系統(tǒng)類似,用戶可以創(chuàng)建目錄,并在其間創(chuàng)建、刪除、移動(dòng)和重命名文件。HDFS不支持userquotas和訪問(wèn)權(quán)限,也不支持鏈接(link),不過(guò)當(dāng)前的架構(gòu)并不排除實(shí)現(xiàn)這些特性。Namenode維護(hù)文件系統(tǒng)的namespace,任何對(duì)文件系統(tǒng)namespace和文件屬性的修改都將被Namenode記錄下來(lái)。應(yīng)用可以設(shè)置HDFS保存的文件的副本數(shù)目,文件副本的數(shù)目稱為文件的replication因子,這個(gè)信息也是由Namenode保存。
四、數(shù)據(jù)復(fù)制
Hadoop分布式文件系統(tǒng)中數(shù)據(jù)復(fù)制如何實(shí)現(xiàn)?HDFS被設(shè)計(jì)成在一個(gè)大集群中可以跨機(jī)器地可靠地存儲(chǔ)海量的文件。它將每個(gè)文件存儲(chǔ)成block序列,除了***一個(gè)block,所有的block都是同樣的大小。文件的所有block為了容錯(cuò)都會(huì)被復(fù)制。每個(gè)文件的block大小和replication因子都是可配置的。Replication因子可以在文件創(chuàng)建的時(shí)候配置,以后也可以改變。HDFS中的文件是write-one,并且嚴(yán)格要求在任何時(shí)候只有一個(gè)writer。Namenode全權(quán)管理block的復(fù)制,它周期性地從集群中的每個(gè)Datanode接收心跳包和一個(gè)Blockreport。心跳包的接收表示該Datanode節(jié)點(diǎn)正常工作,而Blockreport包括了該Datanode上所有的block組成的列表。
1、副本的存放,副本的存放是HDFS可靠性和性能的關(guān)鍵。HDFS采用一種稱為rack-aware的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、有效性和網(wǎng)絡(luò)帶寬的利用。這個(gè)策略實(shí)現(xiàn)的短期目標(biāo)是驗(yàn)證在生產(chǎn)環(huán)境下的表現(xiàn),觀察它的行為,構(gòu)建測(cè)試和研究的基礎(chǔ),以便實(shí)現(xiàn)更先進(jìn)的策略。龐大的HDFS實(shí)例一般運(yùn)行在多個(gè)機(jī)架的計(jì)算機(jī)形成的集群上,不同機(jī)架間的兩臺(tái)機(jī)器的通訊需要通過(guò)交換機(jī),顯然通常情況下,同一個(gè)機(jī)架內(nèi)的兩個(gè)節(jié)點(diǎn)間的帶寬會(huì)比不同機(jī)架間的兩臺(tái)機(jī)器的帶寬大。
通過(guò)一個(gè)稱為RackAwareness的過(guò)程,Namenode決定了每個(gè)Datanode所屬的rackid。一個(gè)簡(jiǎn)單但沒(méi)有優(yōu)化的策略就是將副本存放在單獨(dú)的機(jī)架上。這樣可以防止整個(gè)機(jī)架(非副本存放)失效的情況,并且允許讀數(shù)據(jù)的時(shí)候可以從多個(gè)機(jī)架讀取。這個(gè)簡(jiǎn)單策略設(shè)置可以將副本分布在集群中,有利于組件失敗情況下的負(fù)載均衡。但是,這個(gè)簡(jiǎn)單策略加大了寫的代價(jià),因?yàn)橐粋€(gè)寫操作需要傳輸block到多個(gè)機(jī)架。
在大多數(shù)情況下,replication因子是3,HDFS的存放策略是將一個(gè)副本存放在本地機(jī)架上的節(jié)點(diǎn),一個(gè)副本放在同一機(jī)架上的另一個(gè)節(jié)點(diǎn),***一個(gè)副本放在不同機(jī)架上的一個(gè)節(jié)點(diǎn)。機(jī)架的錯(cuò)誤遠(yuǎn)遠(yuǎn)比節(jié)點(diǎn)的錯(cuò)誤少,這個(gè)策略不會(huì)影響到數(shù)據(jù)的可靠性和有效性。三分之一的副本在一個(gè)節(jié)點(diǎn)上,三分之二在一個(gè)機(jī)架上,其他保存在剩下的機(jī)架中,這一策略改進(jìn)了寫的性能。
2、副本的選擇,為了降低整體的帶寬消耗和讀延時(shí),HDFS會(huì)盡量讓reader讀最近的副本。如果在reader的同一個(gè)機(jī)架上有一個(gè)副本,那么就讀該副本。如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心,那么reader也將首先嘗試讀本地?cái)?shù)據(jù)中心的副本。
3、SafeMode
Namenode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱為SafeMode的特殊狀態(tài),處在這個(gè)狀態(tài)的Namenode是不會(huì)進(jìn)行數(shù)據(jù)塊的復(fù)制的。Namenode從所有的Datanode接收心跳包和Blockreport。Blockreport包括了某個(gè)Datanode所有的數(shù)據(jù)塊列表。每個(gè)block都有指定的最小數(shù)目的副本。當(dāng)Namenode檢測(cè)確認(rèn)某個(gè)Datanode的數(shù)據(jù)塊副本的最小數(shù)目,那么該Datanode就會(huì)被認(rèn)為是安全的;如果一定百分比(這個(gè)參數(shù)可配置)的數(shù)據(jù)塊檢測(cè)確認(rèn)是安全的,那么Namenode將退出SafeMode狀態(tài),接下來(lái)它會(huì)確定還有哪些數(shù)據(jù)塊的副本沒(méi)有達(dá)到指定數(shù)目,并將這些block復(fù)制到其他Datanode。
五、文件系統(tǒng)元數(shù)據(jù)的持久化
Hadoop分布式文件系統(tǒng)文件系統(tǒng)元數(shù)據(jù)的持久化問(wèn)題。Namenode存儲(chǔ)HDFS的元數(shù)據(jù)。對(duì)于任何對(duì)文件元數(shù)據(jù)產(chǎn)生修改的操作,Namenode都使用一個(gè)稱為Editlog的事務(wù)日志記錄下來(lái)。例如,在HDFS中創(chuàng)建一個(gè)文件,Namenode就會(huì)在Editlog中插入一條記錄來(lái)表示;同樣,修改文件的replication因子也將往Editlog插入一條記錄。Namenode在本地OS的文件系統(tǒng)中存儲(chǔ)這個(gè)Editlog。整個(gè)文件系統(tǒng)的namespace,包括block到文件的映射、文件的屬性,都存儲(chǔ)在稱為FsImage的文件中,這個(gè)文件也是放在Namenode所在系統(tǒng)的文件系統(tǒng)上。
Namenode在內(nèi)存中保存著整個(gè)文件系統(tǒng)namespace和文件Blockmap的映像。這個(gè)關(guān)鍵的元數(shù)據(jù)設(shè)計(jì)得很緊湊,因而一個(gè)帶有4G內(nèi)存的Namenode足夠支撐海量的文件和目錄。當(dāng)Namenode啟動(dòng)時(shí),它從硬盤中讀取Editlog和FsImage,將所有Editlog中的事務(wù)作用(apply)在內(nèi)存中的FsImage,并將這個(gè)新版本的FsImage從內(nèi)存中flush到硬盤上,然后再truncate這個(gè)舊的Editlog,因?yàn)檫@個(gè)舊的Editlog的事務(wù)都已經(jīng)作用在FsImage上了。這個(gè)過(guò)程稱為checkpoint。在當(dāng)前實(shí)現(xiàn)中,checkpoint只發(fā)生在Namenode啟動(dòng)時(shí),在不久的將來(lái)我們將實(shí)現(xiàn)支持周期性的checkpoint。
Datanode并不知道關(guān)于文件的任何東西,除了將文件中的數(shù)據(jù)保存在本地的文件系統(tǒng)上。它把每個(gè)HDFS數(shù)據(jù)塊存儲(chǔ)在本地文件系統(tǒng)上隔離的文件中。Datanode并不在同一個(gè)目錄創(chuàng)建所有的文件,相反,它用啟發(fā)式地方法來(lái)確定每個(gè)目錄的***文件數(shù)目,并且在適當(dāng)?shù)臅r(shí)候創(chuàng)建子目錄。在同一個(gè)目錄創(chuàng)建所有的文件不是***的選擇,因?yàn)楸镜匚募到y(tǒng)可能無(wú)法高效地在單一目錄中支持大量的文件。當(dāng)一個(gè)Datanode啟動(dòng)時(shí),它掃描本地文件系統(tǒng),對(duì)這些本地文件產(chǎn)生相應(yīng)的一個(gè)所有HDFS數(shù)據(jù)塊的列表,然后發(fā)送報(bào)告到Namenode,這個(gè)報(bào)告就是Blockreport。
六、通訊協(xié)議
所有的HDFS通訊協(xié)議都是構(gòu)建在TCP/IP協(xié)議上??蛻舳送ㄟ^(guò)一個(gè)可配置的端口連接到Namenode,通過(guò)ClientProtocol與Namenode交互。而Datanode是使用DatanodeProtocol與Namenode交互。從ClientProtocol和Datanodeprotocol抽象出一個(gè)遠(yuǎn)程調(diào)用(RPC),在設(shè)計(jì)上,Namenode不會(huì)主動(dòng)發(fā)起RPC,而是是響應(yīng)來(lái)自客戶端和Datanode的RPC請(qǐng)求。本節(jié)關(guān)于Hadoop分布式文件系統(tǒng)沒(méi)有結(jié)束,請(qǐng)期待下節(jié)介紹。
【編輯推薦】