【HDFS】HDFS的整體架構(gòu)設(shè)計(jì),閱讀筆記
來源:程序員人生 發(fā)布時(shí)間:2015-03-23 08:10:51 閱讀次數(shù):2855次
HDFS是1個(gè)高度容錯(cuò)性的系統(tǒng),合適部署在便宜的機(jī)器上。
HDFS可能由成百上千的
服務(wù)器構(gòu)成,每一個(gè)
服務(wù)器上存儲(chǔ)著文件系統(tǒng)的部份數(shù)據(jù),構(gòu)成系統(tǒng)的組件數(shù)目是巨大的,任1組件都有可能失效,這意味著總是有1部份HDFS的組件是不工作的,所以
HDFS的核心架構(gòu)目標(biāo)是毛病檢測(cè)和快速、自動(dòng)的恢復(fù)。
HDFS上的1個(gè)典型文件大小1般都在G字節(jié)至T字節(jié)
1個(gè)單1的HDFS實(shí)例應(yīng)當(dāng)能支持?jǐn)?shù)以千萬計(jì)的文件
HDFS利用需要1個(gè)“1次寫入屢次讀取”的文件訪問模型。1個(gè)文件經(jīng)過創(chuàng)建、寫入和關(guān)閉以后就不需要改變。這1假定簡(jiǎn)化了數(shù)據(jù)1致性問題,并且使高吞吐量的數(shù)據(jù)訪問成為可能。
1個(gè)利用要求的計(jì)算,離它操作的數(shù)據(jù)越近就越高效,在數(shù)據(jù)到達(dá)海量級(jí)別的時(shí)候更是如此。
HDFS為利用提供了將它們自己移動(dòng)到數(shù)據(jù)附近的接口。
架構(gòu)
HDFS采取主從架構(gòu),1個(gè)HDFS集群有1個(gè)namenode和1定數(shù)目的datanode組成。
namenode是1個(gè)中心
服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的名字空間(namespace)和客戶端對(duì)文件的訪問(namenode去映照文件所在datanode)。
集群中的datanode1般是1個(gè)節(jié)點(diǎn)作為1個(gè)datanode,負(fù)責(zé)管理自己節(jié)點(diǎn)上的存儲(chǔ)。
1個(gè)文件被分成1個(gè)或多個(gè)數(shù)據(jù)塊,存儲(chǔ)在1組datanode上。
namenode負(fù)責(zé)履行文件系統(tǒng)操作,肯定數(shù)據(jù)塊到具體datanode節(jié)點(diǎn)的映照。
datanode負(fù)責(zé)處理文件系統(tǒng)客戶真?zhèn)€讀寫要求,在namenode的統(tǒng)1調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除、復(fù)制。
HDFS采取JAVA開發(fā),因此任何支持java的機(jī)器都可以部署namenode和datanode
集群中單1Namenode的結(jié)構(gòu)大大簡(jiǎn)化了系統(tǒng)的架構(gòu)。Namenode是所有HDFS元數(shù)據(jù)的仲裁者和管理者,這樣,用戶數(shù)據(jù)永久不會(huì)流過Namenode。
HDFS被設(shè)計(jì)成能夠在1個(gè)大集群中跨機(jī)器可靠地存儲(chǔ)超大文件。它將每一個(gè)文件存儲(chǔ)成1系列的數(shù)據(jù)塊,除最后1個(gè),所有的數(shù)據(jù)塊都是一樣大小的。為了容錯(cuò),文件的所有數(shù)據(jù)塊都會(huì)有副本。每一個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的。利用程序可以指定某個(gè)文件的副本數(shù)目。副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也能夠在以后改變。HDFS中的文件都是1次性寫入的,并且嚴(yán)格要求在任什么時(shí)候候只能有1個(gè)寫入者。
Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每一個(gè)Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告(Blockreport)。接收到心跳信號(hào)意味著該Datanode節(jié)點(diǎn)工作正常。塊狀態(tài)報(bào)告包括了1個(gè)該Datanode上所有數(shù)據(jù)塊的列表。
HDFS采取1種稱為機(jī)架感知(rack-aware)的策略來改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。
通過1個(gè)機(jī)架感知的進(jìn)程,Namenode可以肯定每一個(gè)Datanode所屬的機(jī)架id。1個(gè)簡(jiǎn)單但沒有優(yōu)化的策略就是將副本寄存在不同的機(jī)架上。這樣可以有效避免當(dāng)全部機(jī)架失效時(shí)數(shù)據(jù)的丟失,并且允許讀數(shù)據(jù)的時(shí)候充分利用多個(gè)機(jī)架的帶寬。這類策略設(shè)置可以將副本均勻散布在集群中,有益于當(dāng)組件失效情況下的負(fù)載均衡。但是,由于這類策略的1個(gè)寫操作需要傳輸數(shù)據(jù)塊到多個(gè)機(jī)架,這增加了寫的代價(jià)。
在大多數(shù)情況下,副本系數(shù)是3,HDFS的寄存策略是將1個(gè)副本寄存在本地機(jī)架的節(jié)點(diǎn)上,1個(gè)副本放在同1機(jī)架的另外一個(gè)節(jié)點(diǎn)上,最后1個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上。這類策略減少了機(jī)架間的數(shù)據(jù)傳輸,這就提高了寫操作的效力。機(jī)架的毛病遠(yuǎn)遠(yuǎn)比節(jié)點(diǎn)的毛病少,所以這個(gè)策略不會(huì)影響到數(shù)據(jù)的可靠性和可用性。于此同時(shí),由于數(shù)據(jù)塊只放在兩個(gè)(不是3個(gè))不同的機(jī)架上,所以此策略減少了讀取數(shù)據(jù)時(shí)需要的網(wǎng)絡(luò)傳輸總帶寬。在這類策略下,副本其實(shí)不是均勻散布在不同的機(jī)架上。3分之1的副本在1個(gè)節(jié)點(diǎn)上,3分之2的副本在1個(gè)機(jī)架上,其他副本均勻散布在剩下的機(jī)架中,這1策略在不侵害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫的性能。
HDFS會(huì)盡可能讓讀取程序讀取離它最近的副本
namenode啟動(dòng)后會(huì)進(jìn)入1個(gè)安全模式的特殊狀態(tài),這時(shí)候候不會(huì)進(jìn)行塊復(fù)制,但是會(huì)通過塊狀態(tài)報(bào)告確認(rèn)是不是安全(數(shù)據(jù)塊副本到達(dá)最小值的比例),安全后則退出,后續(xù)會(huì)肯定哪些塊副本未達(dá)標(biāo)的將進(jìn)行塊復(fù)制。
EditLog事務(wù)日志,F(xiàn)sImage文件塊映照、文件屬性等
namenode在內(nèi)存中保存映照表,這個(gè)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)緊湊,4G內(nèi)存的namenode足夠支持大量的文件和目錄;
當(dāng)namenode啟動(dòng)時(shí),從硬盤讀取EditLog和FsImage,將所有的EditLog中的事務(wù)作用在內(nèi)存的FsImage上,并將新的FsImage從內(nèi)存保存到磁盤上,然后刪除舊的EditLog,這就是檢查點(diǎn)進(jìn)程。
如果namenode很久都沒有啟動(dòng),那末EditLog是否是漸漸變的愈來愈大了(由于只有啟動(dòng)才會(huì)合并fsimage和edits),下1次啟動(dòng)很慢!!
所以secondary namenode就應(yīng)運(yùn)而生了,負(fù)責(zé)定期合并fsimage和edits,將edits日志大小控制在1個(gè)限度下。和namenode在不同機(jī)器上
datanode啟動(dòng)時(shí),掃描本地文件系統(tǒng),產(chǎn)生1個(gè)本地文件對(duì)應(yīng)的所有HDFS數(shù)據(jù)塊的列表,將這塊狀態(tài)報(bào)告發(fā)送給namenode。
FsImage和Editlog是HDFS的核心數(shù)據(jù)結(jié)構(gòu)。如果這些文件破壞了,全部HDFS實(shí)例都將失效。
因此,Namenode可以配置成支持保護(hù)多個(gè)FsImage和Editlog的副本。任何對(duì)FsImage或Editlog的修改,都將同步到它們的副本上。這類多副本的同步操作可能會(huì)下降Namenode每秒處理的名字空間事務(wù)數(shù)量。但是這個(gè)代價(jià)是可以接受的,由于即便HDFS的利用是數(shù)據(jù)密集的,它們也非元數(shù)據(jù)密集的。當(dāng)Namenode重啟的時(shí)候,它會(huì)選取最近的完全的FsImage和Editlog來使用。
網(wǎng)絡(luò)毛病的解決,datanode失效??
每一個(gè)datanode節(jié)點(diǎn)周期性的想namenode發(fā)送心跳信號(hào)。網(wǎng)絡(luò)斷開可能致使1部份datanode和namenode失去聯(lián)系,namenode通過心跳信號(hào)的缺失將此datanode標(biāo)記為宕機(jī),不會(huì)在將新的IO要求發(fā)給它們。這進(jìn)1步致使1些數(shù)據(jù)塊的副本系數(shù)降落,namenode會(huì)不斷檢測(cè)需要復(fù)制的塊并啟動(dòng)復(fù)制操作。
DFSAdmin
hadoop is deprecated,use hdfs
如何知道誰(shuí)是admin呢??
啟動(dòng)NameNode的用戶被視為HDFS的超級(jí)用戶
副本系數(shù)減小
namenode感知到會(huì)將過剩的副本刪除,下個(gè)心跳會(huì)將該信息傳遞給datanode,datanode行將數(shù)據(jù)塊刪除,空閑空間加大。
fsck用來檢查文件系統(tǒng)
用法:hadoop fsck [GENERIC_OPTIONS]
<path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)