大數(shù)據(jù)技術(shù)hadoop入門理論系列之二—HDFS架構(gòu)簡(jiǎn)介
HDFS簡(jiǎn)單介紹
HDFS全稱是Hadoop Distribute File System,是一個(gè)能運(yùn)行在普通商用硬件上的分布式文件系統(tǒng)。
與其他分布式文件系統(tǒng)顯著不同的特點(diǎn)是:
- HDFS是一個(gè)高容錯(cuò)系統(tǒng)且能運(yùn)行在各種低成本硬件上;
- 提供高吞吐量,適合于存儲(chǔ)大數(shù)據(jù)集;
- HDFS提供流式數(shù)據(jù)訪問(wèn)機(jī)制。
HDFS起源于Apache Nutch,現(xiàn)在是Apache Hadoop項(xiàng)目的核心子項(xiàng)目。
HDFS設(shè)計(jì)假設(shè)和目標(biāo)
- 硬件錯(cuò)誤是常態(tài)
在數(shù)據(jù)中心,硬件異常應(yīng)被視作常態(tài)而非異常態(tài)。
在一個(gè)大數(shù)據(jù)環(huán)境下,hdfs集群有大量物理機(jī)器構(gòu)成,每臺(tái)機(jī)器由很多硬件組成,整個(gè)因?yàn)槟骋粋€(gè)組件出錯(cuò)而出錯(cuò)的幾率是很高的,
因此HDFS架構(gòu)的一個(gè)核心設(shè)計(jì)目標(biāo)就是能夠快速檢測(cè)硬件失效并快速?gòu)氖е谢謴?fù)工作。 - 流式訪問(wèn)要求
在HDFS集群上運(yùn)行的應(yīng)用要求流式訪問(wèn)數(shù)據(jù),HDFS設(shè)計(jì)為適用于批處理而非交互式處理,因此在架構(gòu)設(shè)計(jì)時(shí)更加強(qiáng)調(diào)高吞吐量而非低延遲。
對(duì)于POSIX的標(biāo)準(zhǔn)訪問(wèn)機(jī)制比如隨機(jī)訪問(wèn)會(huì)嚴(yán)重降低吞吐量,HDFS將忽略此機(jī)制。 - 大數(shù)據(jù)集
假定HDFS的典型文件大小是GB甚至TB大小的,HDFS設(shè)計(jì)重點(diǎn)是支持大文件,支持通過(guò)機(jī)器數(shù)量擴(kuò)展以支持更大的集群,
單個(gè)集群應(yīng)提供海量文件數(shù)量支持 - 簡(jiǎn)單一致性模型
HDFS提供的訪問(wèn)模型是一次寫(xiě)入多次讀取的模型。寫(xiě)入后文件保持原樣不動(dòng)簡(jiǎn)化了數(shù)據(jù)一致性模型并且對(duì)應(yīng)用來(lái)說(shuō),它能得到更高的吞吐量。
文件追加也支持。 - 移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)代價(jià)更低
HDFS利用了計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)本地化原理,認(rèn)為數(shù)據(jù)離CPU越近,性能更高。
HDFS提供接口讓?xiě)?yīng)用感知數(shù)據(jù)的物理存儲(chǔ)位置。 - 異構(gòu)軟硬件平臺(tái)兼容
HDFS被設(shè)計(jì)成能方便的從一個(gè)平臺(tái)遷移到另外一個(gè)平臺(tái)
HDFS適用場(chǎng)景
綜合上述的設(shè)計(jì)假設(shè)和后面的架構(gòu)分析,HDFS特別適合于以下場(chǎng)景:
- 順序訪問(wèn)
比如提供流媒體服務(wù)等大文件存儲(chǔ)場(chǎng)景 - 大文件全量訪問(wèn)
如要求對(duì)海量數(shù)據(jù)進(jìn)行全量訪問(wèn),OLAP等 -
整體預(yù)算有限
想利用分布式計(jì)算的便利,又沒(méi)有足夠的預(yù)算購(gòu)買HPC、高性能小型機(jī)等場(chǎng)景
在如下場(chǎng)景其性能不盡如人意:
-
低延遲數(shù)據(jù)訪問(wèn)
低延遲數(shù)據(jù)訪問(wèn)意味著快速數(shù)據(jù)定位,比如10ms級(jí)別響應(yīng),系統(tǒng)若忙于響應(yīng)此類要求,
則有悖于快速返回大量數(shù)據(jù)的假設(shè)。
- 大量小文件
大量小文件將占用大量的文件塊會(huì)造成較大的浪費(fèi)以及對(duì)元數(shù)據(jù)(namenode)是個(gè)嚴(yán)峻的挑戰(zhàn) - 多用戶并發(fā)寫(xiě)入
并發(fā)寫(xiě)入違背數(shù)據(jù)一致性模型,數(shù)據(jù)可能不一致。 - 實(shí)時(shí)更新
HDFS支持append,實(shí)時(shí)更新會(huì)降低數(shù)據(jù)吞吐以及增加維護(hù)數(shù)據(jù)一致的代價(jià)。
HDFS架構(gòu)
本文將從以下幾個(gè)方面分析HDFS架構(gòu),探討HDFS架構(gòu)是如何滿足設(shè)計(jì)目標(biāo)的。
HDFS總體架構(gòu)
下面這張HDFS架構(gòu)圖來(lái)自于hadoop官方網(wǎng)站.
從這上面可以看出,HDFS采取主從式C/S架構(gòu),HDFS的節(jié)點(diǎn)分為兩種角色:
- NameNode
NameNode提供文件元數(shù)據(jù),訪問(wèn)日志等屬性的存儲(chǔ)、操作功能。
文件的基礎(chǔ)信息等存放在NameNode當(dāng)中,采用集中式存儲(chǔ)方案。 -
DataNode
DataNode提供文件內(nèi)容的存儲(chǔ)、操作功能。
文件數(shù)據(jù)塊本身存儲(chǔ)在不同的DataNode當(dāng)中,DataNode可以分布在不同機(jī)架。
HDFS的Client會(huì)分別訪問(wèn)NameNode和DataNode以獲取文件的元信息以及內(nèi)容。HDFS集群的Client將
直接訪問(wèn)NameNode和DataNode,相關(guān)數(shù)據(jù)直接從NameNode或者DataNode傳送到客戶端。
HDFS數(shù)據(jù)組織機(jī)制
HDFS的數(shù)據(jù)組織分成兩部分進(jìn)行理解,首先是NameNode部分,其次是DataNode數(shù)據(jù)部分,數(shù)據(jù)的組織圖如下所示:
- NameNode
基于Yarn架構(gòu)的HDFS中,NameNode采取主從式設(shè)計(jì),主機(jī)主要負(fù)責(zé)客戶端訪問(wèn)元數(shù)據(jù)的要求,以及存儲(chǔ)塊信息。
從機(jī)主要負(fù)責(zé)對(duì)主機(jī)進(jìn)行實(shí)時(shí)備份,同時(shí)定期將用戶操作記錄以及文件記錄歸并到塊存儲(chǔ)設(shè)備,并將其回寫(xiě)到主機(jī)。
當(dāng)主機(jī)失效時(shí),從機(jī)接管主機(jī)所有的工作。 主從NameNode協(xié)同工作方式如下:
Technorati 標(biāo)記: HDFS,hadoop,NameNode,大數(shù)據(jù),架構(gòu)
- DataNode
DataNode負(fù)責(zé)存儲(chǔ)真正的數(shù)據(jù)。DataNode中文件以數(shù)據(jù)塊為基礎(chǔ)單位,數(shù)據(jù)塊大小固定。整個(gè)集群中,同一個(gè)數(shù)據(jù)塊
將被保存多份,分別存儲(chǔ)在不同的DataNode當(dāng)中。其中數(shù)據(jù)塊大小,副本個(gè)數(shù)由hadoop的配置文件參數(shù)確定。數(shù)據(jù)塊大小、
副本個(gè)數(shù)在集群?jiǎn)?dòng)后可以修改,修改后的參數(shù)重啟之后生效,不影響現(xiàn)有的文件。
DataNode啟動(dòng)之后會(huì)掃描本地文件系統(tǒng)中物理塊個(gè)數(shù),并將對(duì)應(yīng)的數(shù)據(jù)塊信息匯報(bào)給NameNode。
HDFS數(shù)據(jù)訪問(wèn)機(jī)制
HDFS的文件訪問(wèn)機(jī)制為流式訪問(wèn)機(jī)制,即通過(guò)API打開(kāi)文件的某個(gè)數(shù)據(jù)塊之后,可以順序讀取或者寫(xiě)入某個(gè)文件,不可以指定
讀取文件然后進(jìn)行文件操作。
由于HDFS中存在多個(gè)角色,且對(duì)應(yīng)應(yīng)用場(chǎng)景主要為一次寫(xiě)入多次讀取的場(chǎng)景,因此其讀和寫(xiě)的方式有較大不同。讀寫(xiě)操作都由
客戶端發(fā)起,并且進(jìn)行整個(gè)流程的控制,服務(wù)器角色(NameNode和DataNode)都是被動(dòng)式響應(yīng)。
下面分別對(duì)其進(jìn)行 介紹:
- 讀取流程
客戶端發(fā)起讀取請(qǐng)求時(shí),首先與Namenode機(jī)進(jìn)行連接,連接時(shí)同樣需要hdfs配置文件,因此其知道各服務(wù)器相關(guān)信息。連接建立
完成后,客戶端請(qǐng)求讀取某個(gè)文件的某一個(gè)數(shù)據(jù)塊,NameNode在內(nèi)存中進(jìn)行檢索,查看是否有對(duì)應(yīng)的文件以及文件塊,若沒(méi)有
則通知客戶端對(duì)應(yīng)文件或塊不存在。若有則通知客戶端對(duì)應(yīng)的數(shù)據(jù)塊存在哪些服務(wù)器之上,客戶端確定收到信息之后,與對(duì)應(yīng)的數(shù)據(jù)
接連連接,并開(kāi)始進(jìn)行網(wǎng)絡(luò)傳輸??蛻舳巳我膺x擇其中一個(gè)副本數(shù)據(jù)進(jìn)行讀操作。
流程分析 ?使用HDFS提供的客戶端開(kāi)發(fā)庫(kù)Client,向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求;
? Namenode會(huì)視情況返回文件的部分或者全部block列表,對(duì)于每個(gè)block,Namenode都會(huì)返回有該block拷貝的DataNode地址;
?客戶端開(kāi)發(fā)庫(kù)Client會(huì)選取離客戶端最接近的DataNode來(lái)讀取block;如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù).
?讀取完當(dāng)前block的數(shù)據(jù)后,關(guān)閉與當(dāng)前的DataNode連接,并為讀取下一個(gè)block尋找最佳的DataNode;
?當(dāng)讀完列表的block后,且文件讀取還沒(méi)有結(jié)束,客戶端開(kāi)發(fā)庫(kù)會(huì)繼續(xù)向Namenode獲取下一批的block列表。
?讀取完一個(gè)block都會(huì)進(jìn)行checksum驗(yàn)證,如果讀取datanode時(shí)出現(xiàn)錯(cuò)誤,客戶端會(huì)通知Namenode,然后再?gòu)南乱粋€(gè)擁有該block拷貝的datanode繼續(xù)讀。
- 寫(xiě)入流程
客戶端發(fā)起寫(xiě)入求時(shí),NameNode在內(nèi)存中進(jìn)行檢索,查看是否有對(duì)應(yīng)的文件以及文件塊,若有 則通知客戶端對(duì)應(yīng)文件或塊已存在,
若沒(méi)有則通知客戶端某臺(tái)服務(wù)器作為寫(xiě)入主服務(wù)器。NameNode同時(shí)通知寫(xiě)入主服務(wù)器就緒,客戶端與主服務(wù)器進(jìn)行通信并寫(xiě)入數(shù)據(jù)時(shí),
主寫(xiě)入服務(wù)器寫(xiě)入數(shù)據(jù)到物理磁盤,寫(xiě)入完成之后與NameNode通信獲取其下一個(gè)副本服務(wù)器地址,確認(rèn)地址之后將數(shù)據(jù)傳遞給它,這樣
進(jìn)行接力棒式寫(xiě)入,一直到達(dá)設(shè)置副本數(shù)目為止,等最后一個(gè)副本寫(xiě)完成,則同樣將寫(xiě)入成功失敗情況以接力棒方式返回給客戶端,最后
客戶端通知NameNode數(shù)據(jù)塊寫(xiě)入成功,若其中某臺(tái)失敗則整個(gè)寫(xiě)入失敗。
流程分析 ?使用HDFS提供的客戶端開(kāi)發(fā)庫(kù)Client,向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求;
?Namenode會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì)為文件 創(chuàng)建一個(gè)記錄,否則會(huì)讓客戶端拋出異常;
?當(dāng)客戶端開(kāi)始寫(xiě)入文件的時(shí)候,會(huì)將文件切分成多個(gè)packets,并在內(nèi)部以數(shù)據(jù)隊(duì)列"data queue"的形式管理這些packets,并向Namenode申請(qǐng)新的blocks,獲取用來(lái)存儲(chǔ)replicas的合適的datanodes列表,列表的大小根據(jù)在Namenode中對(duì)replication的設(shè)置而定。
?開(kāi)始以pipeline(管道)的形式將packet寫(xiě)入所有的replicas中。把packet以流的方式寫(xiě)入第一個(gè)datanode,該datanode把該packet存儲(chǔ)之后,再將其傳遞給在此pipeline中的下一個(gè)datanode,直到最后一個(gè)datanode,這種寫(xiě)數(shù)據(jù)的方式呈流水線的形式。
?最后一個(gè)datanode成功存儲(chǔ)之后會(huì)返回一個(gè)ack packet,在pipeline里傳遞至客戶端,在客戶端的開(kāi)發(fā)庫(kù)內(nèi)部維護(hù)著"ack queue",成功收到datanode返回的ack packet后會(huì)從"ack queue"移除相應(yīng)的packet。
?如果傳輸過(guò)程中,有某個(gè)datanode出現(xiàn)了故障,那么當(dāng)前的pipeline會(huì)被關(guān)閉,出現(xiàn)故障的datanode會(huì)從當(dāng)前的pipeline中移除,剩余的block會(huì)繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸,同時(shí)Namenode會(huì)分配一個(gè)新的datanode,保持replicas設(shè)定的數(shù)量。
HDFS數(shù)據(jù)安全機(jī)制
HDFS文件系統(tǒng)的安全機(jī)制采取類linux的ACL安全訪問(wèn)機(jī)制。每一個(gè)文件默認(rèn)繼承其父對(duì)象即目錄的訪問(wèn)權(quán)限,默認(rèn)的用戶和屬組來(lái)自于
上傳客戶端的用戶。相關(guān)控制方法也與linux類似,可以通過(guò)命令或者API指定某個(gè)用戶對(duì)某個(gè)文件的讀寫(xiě)權(quán)限。當(dāng)用戶沒(méi)有對(duì)應(yīng)的權(quán)限時(shí),
若進(jìn)行文件讀寫(xiě)操作將會(huì)得到對(duì)應(yīng)的錯(cuò)誤提示。
HDFS高可用性機(jī)制
HDFS作為一個(gè)高可用集群,其可用性設(shè)計(jì)是非常用心的,主要體現(xiàn)在:
- NameNode主從設(shè)計(jì)
主從設(shè)計(jì)保證了元數(shù)據(jù)的可靠,解決了HDFS 1.0中單點(diǎn)故障的問(wèn)題。具體可以參看上文描述 - 數(shù)據(jù)副本機(jī)制
數(shù)據(jù)副本機(jī)制保證了存放在某臺(tái)服務(wù)器的文件塊因?yàn)槟撤N原因遭到破壞的時(shí)候,整個(gè)集群照樣可以對(duì)外提供
文件訪問(wèn)服務(wù),具體請(qǐng)參考上文數(shù)據(jù)訪問(wèn)機(jī)制部分。 - 數(shù)據(jù)恢復(fù)機(jī)制
這兒的數(shù)據(jù)恢復(fù)指HDFS提供一定時(shí)間的反悔窗口期,默認(rèn)系統(tǒng)中被刪除的文件被移動(dòng)到trash目錄里面,過(guò)了
一段時(shí)間之后有HDFS清理掉,此機(jī)制在云存儲(chǔ)中普遍使用。若某數(shù)據(jù)塊失效,通過(guò)副本機(jī)制則可以恢復(fù)。 - 機(jī)架感知機(jī)制
大型集群的組織是以機(jī)架形式組織的,機(jī)器以固定數(shù)量服務(wù)器以及對(duì)應(yīng)的網(wǎng)絡(luò)設(shè)備組成一個(gè)機(jī)柜,一般來(lái)說(shuō),跨機(jī)架的網(wǎng)絡(luò)IO總是比同一機(jī)架更高,當(dāng)然若跨機(jī)房則代價(jià)更高。因此HDFS總是想辦法將數(shù)據(jù)保存在性能更好的服務(wù)器當(dāng)中以提升性能,同時(shí)會(huì)設(shè)法將數(shù)據(jù)保存到不同機(jī)架以保證數(shù)據(jù)的容錯(cuò)性。典型機(jī)架拓?fù)浜透北救缦聢D所示:
在應(yīng)用讀取數(shù)據(jù)時(shí),HDFS總是選擇離應(yīng)用更近的服務(wù)器。 - 快照機(jī)制
- 自動(dòng)錯(cuò)誤檢測(cè)恢復(fù)機(jī)制
機(jī)器失效檢測(cè)通過(guò)心跳檢測(cè)完成,若在一段時(shí)間內(nèi),DataNode或者NameNode不能返回心跳,主NameNode會(huì)將其標(biāo)記為宕機(jī)服務(wù)器,此后新的IO請(qǐng)求等將不會(huì)被轉(zhuǎn)發(fā)到此服務(wù)器,同時(shí)對(duì)應(yīng)的文件若有相關(guān)文件因?yàn)槟撑_(tái)服務(wù)器宕機(jī)導(dǎo)致副本數(shù)目達(dá)不到指定數(shù)目,HDFS將重新復(fù)制部分文件副本,以保證整個(gè)集群的可靠性。 - 校驗(yàn)和機(jī)制
校驗(yàn)和是指對(duì)每一個(gè)數(shù)據(jù)塊產(chǎn)生一個(gè)校驗(yàn)和,當(dāng)數(shù)據(jù)被再次讀取時(shí),客戶端對(duì)其進(jìn)行計(jì)算并與服務(wù)器上的校驗(yàn)和進(jìn)行比較,保證了數(shù)據(jù)不會(huì)因?yàn)榫W(wǎng)絡(luò)傳輸或者其他方式被篡改。
HDFS集群擴(kuò)展機(jī)制
集群的動(dòng)態(tài)擴(kuò)展方式方便用戶以動(dòng)態(tài)的方式對(duì)集群進(jìn)行擴(kuò)容和縮容。若有新服務(wù)器加入,則后續(xù)的IO會(huì)有更多的機(jī)會(huì)被
發(fā)送到新服務(wù)器上執(zhí)行,對(duì)集群中現(xiàn)有文件的充分分布,可以通過(guò)命令進(jìn)行,但是數(shù)據(jù)重新分布將只占用少量網(wǎng)絡(luò)IO,這樣保證集群上的應(yīng)用不會(huì)因?yàn)橹胤植级艿街卮笥绊憽M瑯訖C(jī)器下架也通過(guò)命令進(jìn)行,此時(shí)集群表現(xiàn)出與機(jī)器宕機(jī)類似情況,會(huì)不再往其上發(fā)IO請(qǐng)求以及重新復(fù)制以保證副本數(shù)量。
參考文獻(xiàn):
- HDFS Design Document
- HDFS 原理、架構(gòu)與特性介紹