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