HDFS原理 | 一文讀懂HDFS架構(gòu)與設(shè)計(jì)
1 前言
HDFS(Hadoop Distributed File System)是我們熟知的Hadoop分布式文件系統(tǒng),是一個(gè)高容錯(cuò)的系統(tǒng),能提供高吞吐量的數(shù)據(jù)訪問(wèn),非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。HDFS以流式數(shù)據(jù)訪問(wèn)模式存儲(chǔ)超大文件,將數(shù)據(jù)按塊分布式存儲(chǔ)到不同機(jī)器上, 并被設(shè)計(jì)成 適合運(yùn)行在普通廉價(jià)硬件之上。 本文根據(jù)Hadoop官網(wǎng)HDFS Architecture這一章節(jié)提煉而成, 加上筆者自己的理解,希望能夠幫助讀者快速掌握HDFS 。
2 HDFS特點(diǎn)
流式數(shù)據(jù)訪問(wèn):這點(diǎn)初學(xué)者可能不好理解,流式數(shù)據(jù)訪問(wèn)模式是HDFS數(shù)據(jù)訪問(wèn)特點(diǎn)之一,是指收集到部分?jǐn)?shù)據(jù)就開(kāi)始處理,而不是收集到全部數(shù)據(jù)再處理,否則會(huì)導(dǎo)致比較大的延遲,也會(huì)消耗大量?jī)?nèi)存。
大規(guī)模數(shù)據(jù)集:HDFS對(duì)大文件存儲(chǔ)比較友好,HDFS上的一個(gè)典型文件大小一般都在GB至TB級(jí)。
一次寫(xiě)入多次讀取:HDFS數(shù)據(jù)訪問(wèn)特點(diǎn)之一,文件經(jīng)過(guò)創(chuàng)建、寫(xiě)入和關(guān)閉之后就不能夠改變。這也簡(jiǎn)化了數(shù)據(jù)一致性問(wèn)題,并且使高吞吐量的數(shù)據(jù)訪問(wèn)成為可能。
不支持低延時(shí)數(shù)據(jù)訪問(wèn):這也是HDFS數(shù)據(jù)訪問(wèn)的特點(diǎn),HDFS關(guān)系的是高吞吐量,不適合那些低延時(shí)數(shù)據(jù)訪問(wèn)的應(yīng)用。
單用戶(hù)寫(xiě)入,不支持任意修改:HDFS的數(shù)據(jù)以讀為主,只支持單個(gè)寫(xiě)入者,并且寫(xiě)操作總是以添加的形式在文末追加,不支持在任意位置進(jìn)行修改。
3 HDFS架構(gòu)
HDFS采用Master/Slave架構(gòu)。一個(gè)HDFS集群有兩個(gè)重要的角色,分別是Namenode和Datanode。Namenode是管理節(jié)點(diǎn),負(fù)責(zé)管理文件系統(tǒng)的命名空間(namespace)以及客戶(hù)端對(duì)文件的訪問(wèn)。Datanode是實(shí)際存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn)。HDFS暴露了文件系統(tǒng)的命名空間,用戶(hù)能夠以操作文件的形式在上面操作數(shù)據(jù)。HDFS架構(gòu)圖如下:

HDFS上的文件是以數(shù)據(jù)塊的形式存放的,這些數(shù)據(jù)塊通常存儲(chǔ)在一組Datanode上。Namenode執(zhí)行文件系統(tǒng)的命名空間操作,比如打開(kāi)、關(guān)閉、重命名文件或目錄。它也負(fù)責(zé)確定數(shù)據(jù)塊到具體Datanode節(jié)點(diǎn)的映射。Datanode負(fù)責(zé)處理文件系統(tǒng)客戶(hù)端的讀寫(xiě)請(qǐng)求,并在Namenode的統(tǒng)一調(diào)度下執(zhí)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。
4 數(shù)據(jù)塊與副本機(jī)制
HDFS被設(shè)計(jì)成能夠在一個(gè)大集群中跨機(jī)器可靠地存儲(chǔ)超大文件。它將每個(gè)文件存儲(chǔ)成一系列的數(shù)據(jù)塊,除了最后一個(gè),所有的數(shù)據(jù)塊都是同樣大小的。為了容錯(cuò),文件的所有數(shù)據(jù)塊都會(huì)有副本。每個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的。應(yīng)用程序可以指定某個(gè)文件的副本數(shù)目。副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也可以在之后改變。HDFS中的文件都是一次性寫(xiě)入的,并且嚴(yán)格要求在任何時(shí)候只能有一個(gè)寫(xiě)入者。

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)告包含了一個(gè)該Datanode上所有數(shù)據(jù)塊的列表。
5 機(jī)架感知與副本存放
副本的存放是HDFS可靠性和性能的關(guān)鍵,HDFS在這方面做了優(yōu)化,它采用一種稱(chēng)為 機(jī)架感知 (Rack Awareness) 的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率。
大型HDFS 實(shí)例一般運(yùn)行在跨越多個(gè)機(jī)架的計(jì)算機(jī)組成的集群上,不同機(jī)架上的兩臺(tái)機(jī)器之間的通訊需要經(jīng)過(guò)交換機(jī)。在大多數(shù)情況下,同一個(gè)機(jī)架內(nèi)的兩臺(tái)機(jī)器間的帶寬會(huì)比不同機(jī)架的兩臺(tái)機(jī)器間的帶寬大。
通過(guò)一個(gè)機(jī)架感知的過(guò)程,Namenode可以確定每個(gè)Datanode所屬的機(jī)架id。一個(gè)簡(jiǎn)單但沒(méi)有優(yōu)化的策略就是將副本存放在不同的機(jī)架上。這樣可以有效防止當(dāng)整個(gè)機(jī)架失效時(shí)數(shù)據(jù)的丟失,并且允許讀數(shù)據(jù)的時(shí)候充分利用多個(gè)機(jī)架的帶寬。這種策略設(shè)置可以將副本均勻分布在集群中,有利于當(dāng)組件失效情況下的負(fù)載均衡。但是,因?yàn)檫@種策略的一個(gè)寫(xiě)操作需要傳輸數(shù)據(jù)塊到多個(gè)機(jī)架,這增加了寫(xiě)的代價(jià)。
在大多數(shù)情況下,副本系數(shù)是3, HDFS存放策略 是將一個(gè)副本存放在本地機(jī)架的節(jié)點(diǎn)上,一個(gè)副本放在同一機(jī)架的另一個(gè)節(jié)點(diǎn)上,最后一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上。這種策略減少了機(jī)架間的數(shù)據(jù)傳輸,這就提高了寫(xiě)操作的效率。機(jī)架的錯(cuò)誤遠(yuǎn)遠(yuǎn)比節(jié)點(diǎn)的錯(cuò)誤少,所以這個(gè)策略不會(huì)影響到數(shù)據(jù)的可靠性和可用性。于此同時(shí),因?yàn)閿?shù)據(jù)塊只放在兩個(gè)(不是三個(gè))不同的機(jī)架上,所以此策略減少了讀取數(shù)據(jù)時(shí)需要的網(wǎng)絡(luò)傳輸總帶寬。這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫(xiě)的性能。
6 HDFS元數(shù)據(jù)管理
Namenode上保存著HDFS的命名空間。對(duì)于任何對(duì)文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作,Namenode都會(huì)使用一種稱(chēng)為EditLog的事務(wù)日志記錄下來(lái)。例如,在HDFS中創(chuàng)建一個(gè)文件,Namenode就會(huì)在Editlog中插入一條記錄來(lái)表示;同樣地,修改文件的副本系數(shù)也將往Editlog插入一條記錄。Namenode在本地操作系統(tǒng)的文件系統(tǒng)中存儲(chǔ)這個(gè)Editlog。整個(gè)文件系統(tǒng)的命名空間,包括數(shù)據(jù)塊到文件的映射、文件的屬性等,都存儲(chǔ)在一個(gè)稱(chēng)為FsImage的文件中,這個(gè)文件也是放在Namenode所在的本地文件系統(tǒng)上。
Namenode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的命名空間和文件數(shù)據(jù)塊映射(Blockmap)的映像。當(dāng)Namenode啟動(dòng),或者檢查點(diǎn)被周期性觸發(fā)時(shí),它從硬盤(pán)中讀取Editlog和FsImage,將所有Editlog中的事務(wù)作用在內(nèi)存中的FsImage上,并將這個(gè)新版本的FsImage從內(nèi)存持久化到本地磁盤(pán)上。然后HDFS刪除舊的Editlog,因?yàn)檫@個(gè)舊 的Editlog的事務(wù)都已經(jīng)作用在FsImage上了。這個(gè)過(guò)程被稱(chēng)為一個(gè) 檢查點(diǎn) (checkpoint)。 在檢查點(diǎn)期間,Editlog的更改將應(yīng)用于FsImage。 checkpoint 觸發(fā)時(shí)機(jī) ,可以是以給定的時(shí)間間隔(dfs.namenode.checkpoint.period,單位秒)觸發(fā),或者在給定數(shù)量的文件系統(tǒng)事務(wù)累積之后(dfs.namenode.checkpoint.txns)觸發(fā)。 如果設(shè)置了這兩個(gè)屬性,則要達(dá)到的第一個(gè)閾值將觸發(fā)檢查點(diǎn)。
7 總結(jié)
本文屬于HDFS入門(mén)介紹,主要介紹了HDFS基本架構(gòu)、副本機(jī)制,機(jī)架感知及元數(shù)據(jù)管理等方面內(nèi)容 。