摘 要HDFS是Hadoop應(yīng)用用到的一個(gè)最主要的分布式存儲(chǔ)系統(tǒng),Hadoop分布式文件系統(tǒng)具有方便、健壯、可擴(kuò)展性、容錯(cuò)性能好、操作簡(jiǎn)單、成本低廉等許多優(yōu)勢(shì)。。深入了解HDFS的工作原理對(duì)在特定集群上改進(jìn)HDFS的運(yùn)行性能和錯(cuò)誤診斷都有極大的幫助。本文介紹了HDFS的主要設(shè)計(jì)理念、主要概念及其高可靠性的實(shí)現(xiàn)等。
【關(guān)鍵詞】Hadoop 分布式 文件系統(tǒng)
Hadoop是新一代的大數(shù)據(jù)處理平臺(tái),在近十年中已成為大數(shù)據(jù)革命的中心,它不僅僅承擔(dān)存儲(chǔ)海量數(shù)據(jù),還通過(guò)分析從中獲取有價(jià)值信息。進(jìn)行海量計(jì)算需要一個(gè)穩(wěn)定的,安全的數(shù)據(jù)容器,管理網(wǎng)絡(luò)中跨多臺(tái)計(jì)算機(jī)存儲(chǔ)的文件系統(tǒng)稱(chēng)為分布式文件系統(tǒng)。Hadoop分布式文件系統(tǒng)(Hadoop Distributed File System)運(yùn)應(yīng)而生,它是Hadoop的底層實(shí)現(xiàn)部分,存儲(chǔ)Hadoop集群中所有存儲(chǔ)節(jié)點(diǎn)上的文件。
1 HDFS的設(shè)計(jì)理念
面對(duì)存儲(chǔ)超大文件,Hadoop分布式文件系統(tǒng)采用了流式數(shù)據(jù)訪問(wèn)模式。所謂流式數(shù)據(jù),簡(jiǎn)單的說(shuō)就是像流水一樣,數(shù)據(jù)一點(diǎn)一點(diǎn)“流”過(guò)來(lái),處理數(shù)據(jù)也是一點(diǎn)一點(diǎn)處理。如果是全部收到數(shù)據(jù)以后再進(jìn)行處理,那么延遲會(huì)很大,而且會(huì)消耗大量計(jì)算機(jī)內(nèi)存。
1.1 存儲(chǔ)超大文件
這里的“超大文件”通常達(dá)到幾百GB甚至達(dá)到TB大小的文件。像大型的應(yīng)用系統(tǒng),其存儲(chǔ)超過(guò)PB級(jí)數(shù)據(jù)的Hadoop集群比比皆是。
1.2 數(shù)據(jù)訪問(wèn)模式
最高效的訪問(wèn)模式是一次寫(xiě)入、多次讀取。HDFS的構(gòu)建思路也是這樣的。HDFS存儲(chǔ)的數(shù)據(jù)集作為Hadoop的分析對(duì)象。在數(shù)據(jù)集生成以后,采用各種不同分析方法對(duì)該數(shù)據(jù)集進(jìn)行長(zhǎng)時(shí)間分析,而且分析涉及到該數(shù)據(jù)集的大部分?jǐn)?shù)據(jù)或者全部數(shù)據(jù)。面對(duì)龐大數(shù)據(jù),時(shí)間延遲是不可避免的,因此,Hadoop不適合運(yùn)行低時(shí)間延遲數(shù)據(jù)訪問(wèn)的應(yīng)用。
1.3 運(yùn)行在普通廉價(jià)的服務(wù)器上
HDFS設(shè)計(jì)理念之一就是讓它能運(yùn)行在普通的硬件之上,即便硬件出現(xiàn)故障,也可以通過(guò)容錯(cuò)策略來(lái)保證數(shù)據(jù)的高可用。
2 HDFS的主要概念
2.1 數(shù)據(jù)塊(block)
HDFS最基本的存儲(chǔ)單位是64M的數(shù)據(jù)塊,與普通文件系統(tǒng)相比,HDFS有這樣的優(yōu)點(diǎn):假如一個(gè)文件小于一個(gè)數(shù)據(jù)塊的大小,則不會(huì)占用整個(gè)數(shù)據(jù)塊存儲(chǔ)空間。抽象塊具有文件的所有塊不需要存儲(chǔ)在同一磁盤(pán)上的優(yōu)點(diǎn),使用抽象塊作為存儲(chǔ)單元,則大大簡(jiǎn)化了存儲(chǔ)子系統(tǒng)的設(shè)計(jì)。
數(shù)據(jù)塊如設(shè)置過(guò)大,會(huì)導(dǎo)致集群利用率過(guò)低。如設(shè)置過(guò)小,要維護(hù)的元數(shù)據(jù)信息過(guò)多,由于元數(shù)據(jù)信息是存儲(chǔ)在內(nèi)存中的,所以可能會(huì)造成內(nèi)存溢出。
2.2 HDFS數(shù)據(jù)節(jié)點(diǎn)
2.2.1 元數(shù)據(jù)節(jié)點(diǎn)(Namenode)
(1)其將所有的文件和文件夾的元數(shù)據(jù)保存在一個(gè)文件系統(tǒng)樹(shù)中。
(2)元數(shù)據(jù)中存放著文件包括哪些數(shù)據(jù)塊以及這些數(shù)據(jù)分布到哪些DataNode數(shù)據(jù)節(jié)點(diǎn)上。
· VERSION——保存著Hadoop分布式文件系統(tǒng)的版本號(hào)。
· fsimage——元數(shù)據(jù)的鏡像文件,元數(shù)據(jù)保存在磁盤(pán)上的一個(gè)副本。
· edits——修改日志文件,記錄引發(fā)元數(shù)據(jù)改變的操作。
· fstime——合并fimage和edits的時(shí)間。
2.2.2 數(shù)據(jù)節(jié)點(diǎn)(DataNode)
(1)文件系統(tǒng)數(shù)據(jù)真正存儲(chǔ)在數(shù)據(jù)節(jié)點(diǎn)。
(2)將存儲(chǔ)的數(shù)據(jù)塊信息周期性的向元數(shù)據(jù)信息(namenode)回報(bào)。
(3)數(shù)據(jù)節(jié)點(diǎn)為客戶(hù)端(client)或者元數(shù)據(jù)信息(namenode)提供寫(xiě)入或者讀出數(shù)據(jù)塊的請(qǐng)求。
2.2.3 從元數(shù)據(jù)節(jié)點(diǎn)(secondary namenode)
(1)元數(shù)據(jù)節(jié)點(diǎn)和從元數(shù)據(jù)節(jié)點(diǎn)分工不同,它們負(fù)責(zé)的事情并不相同,從元數(shù)據(jù)節(jié)點(diǎn)并不是元數(shù)據(jù)節(jié)點(diǎn)的備用節(jié)點(diǎn)。
(2)從元數(shù)據(jù)節(jié)點(diǎn)主要功能以防edits修改日志文件過(guò)大,周期性將元數(shù)據(jù)節(jié)點(diǎn)的fsimage和edits合并。
(3)simage和edits合并過(guò)后的命名空間鏡像文件從元數(shù)據(jù)節(jié)點(diǎn)也保存了一份,以防元數(shù)據(jù)節(jié)點(diǎn)失敗的時(shí)候,可以恢復(fù),確保數(shù)據(jù)的安全性。
3 HDFS高可靠性的實(shí)現(xiàn)
3.1 安全模式
所謂安全模式就是Hadoop分布式文件系統(tǒng)剛剛啟動(dòng)時(shí),名字節(jié)點(diǎn)進(jìn)入一個(gè)特殊的狀態(tài)。當(dāng)處于安全模式時(shí),名字節(jié)點(diǎn)不能做任何文件操作,甚至不允許內(nèi)部的副本創(chuàng)建。名字節(jié)點(diǎn)需要收集各個(gè)數(shù)據(jù)節(jié)點(diǎn)的報(bào)告, 當(dāng)數(shù)據(jù)塊達(dá)到最小副本數(shù)以上時(shí),會(huì)被認(rèn)為是“安全”的。當(dāng)認(rèn)為安全的數(shù)據(jù)塊所占的比例達(dá)到了某個(gè)閾值(可配置),在過(guò)若干時(shí)間,安全模式結(jié)束,當(dāng)檢測(cè)到副本數(shù)不足的數(shù)據(jù)塊是,該塊會(huì)被復(fù)制,直到達(dá)到最小副本數(shù)。
3.2 數(shù)據(jù)一致性
在HDFS中,每一個(gè)數(shù)據(jù)塊,都有一個(gè)版本標(biāo)識(shí),假如數(shù)據(jù)發(fā)生變化,則版本標(biāo)識(shí)將會(huì)相應(yīng)變化,在元數(shù)據(jù)信息(namenode)里,保存著各個(gè)數(shù)據(jù)塊的版本,如果出現(xiàn)與數(shù)據(jù)服務(wù)器上版本不一致,則會(huì)啟動(dòng)恢復(fù)流程。由于各個(gè)網(wǎng)絡(luò)情況非常復(fù)雜,僅僅靠簡(jiǎn)單的版本信息不能保證內(nèi)容一致。依照內(nèi)容,采取簽名的方法有效解決了數(shù)據(jù)內(nèi)容一致性問(wèn)題。
當(dāng)客戶(hù)端向數(shù)據(jù)服務(wù)器追加寫(xiě)人數(shù)據(jù)包時(shí),HDFS 會(huì)對(duì)寫(xiě)入的所有數(shù)據(jù)進(jìn)行校驗(yàn)和(checksum) 計(jì)算,并在讀取數(shù)據(jù)時(shí)驗(yàn)證該數(shù)據(jù)的校驗(yàn)和。各個(gè)數(shù)據(jù)包簽名驗(yàn)證的基本單位為512字節(jié)。一個(gè)由多個(gè)數(shù)據(jù)節(jié)點(diǎn)組成的隊(duì)列會(huì)同時(shí)接收客戶(hù)端發(fā)送數(shù)據(jù)和校驗(yàn)和,最后一個(gè)數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)驗(yàn)證校驗(yàn)和。假如發(fā)現(xiàn)當(dāng)前的傳輸塊簽名與在客戶(hù)端中的簽名不一致時(shí),整個(gè)數(shù)據(jù)包的寫(xiě)入則為無(wú)效。
3.3 心跳包(HeartBeats)機(jī)制
所謂心跳包就是通過(guò)周期性的活動(dòng)來(lái)檢查數(shù)據(jù)節(jié)點(diǎn)的活性,就像跳動(dòng)的心臟一樣。HDFS采用了心跳包(Heart beat)機(jī)制保證名字節(jié)點(diǎn)和各個(gè)數(shù)據(jù)節(jié)點(diǎn)的聯(lián)系。名字節(jié)點(diǎn)周期性向管理的各個(gè)數(shù)據(jù)節(jié)點(diǎn)發(fā)送心跳包,而收到心跳包的數(shù)據(jù)節(jié)點(diǎn)則有效回復(fù)。通過(guò)定時(shí)發(fā)送心跳包,名字節(jié)點(diǎn)把要執(zhí)行的命令通過(guò)心跳包發(fā)送給數(shù)據(jù)節(jié)點(diǎn),而數(shù)據(jù)節(jié)點(diǎn)收到心跳包,及時(shí)回復(fù)名字節(jié)點(diǎn),同時(shí)開(kāi)始與用戶(hù)或者應(yīng)用的數(shù)據(jù)傳輸。
3.4 租約機(jī)制
在Linux中,為了防止出現(xiàn)多個(gè)進(jìn)程向同一個(gè)文件寫(xiě)數(shù)據(jù)的情況,采用了文件加鎖的機(jī)制。在HDFS中需要一種機(jī)制來(lái)防止同一個(gè)文件被多個(gè)人寫(xiě)入數(shù)據(jù),這就是租約。名字節(jié)點(diǎn)在打開(kāi)或創(chuàng)建一個(gè)文件,準(zhǔn)備追加寫(xiě)之前,會(huì)與此客戶(hù)端簽訂一份租約。名字節(jié)點(diǎn)保證同一個(gè)文件只發(fā)放一個(gè)租約,就有效防止出現(xiàn)多人寫(xiě)入的情況。假如文件被刪除了,客戶(hù)端宕機(jī)了,當(dāng)超過(guò)租約期限時(shí),名字節(jié)點(diǎn)就會(huì)剝奪此租約,將這個(gè)文件的享用權(quán),分配給他人。如此,來(lái)避免由于客戶(hù)端停機(jī)帶來(lái)的資源被長(zhǎng)期霸占的問(wèn)題。
3.5 回滾機(jī)制
HDFS安裝或者升級(jí)時(shí),會(huì)將當(dāng)前的版本信息保存起來(lái),一旦系統(tǒng)升級(jí)導(dǎo)致BUG或者不兼容,這一問(wèn)題可以通過(guò)回滾回到舊版本解決。如果升級(jí)之后一段時(shí)間內(nèi)運(yùn)行正常,則保存版本信息。若運(yùn)行不正常,則根據(jù)舊版本信息,恢復(fù)至之前的版本。
參考文獻(xiàn)
[1]陸嘉恒.Hadoop實(shí)戰(zhàn)[M].機(jī)械工業(yè)出版社,2014.
[2]Tom White.Hadoop權(quán)威指南[M].清華大學(xué)出版社,2015.
作者簡(jiǎn)介
陳忠義(1976-),男,浙江省溫州市人。碩士研究生。工程師。主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù)等。
作者單位
浙江省溫州市公安局 浙江省溫州市 325000