劉涌+裴春梅+韓偉+高震宇
摘要:Hadoop的文件系統HDFS(Hadoop Disttributed Filesystem)是一種分布式文件系統,它利用多個商用硬件構成存儲集群,利用namenode進行數據的存儲控制,具有支持超大文件、存儲靈活、可靠性高等特點,在面對大量數據存儲的時候,能夠高效地工作,但在處理大量小數據時、需要進行低延遲數據訪問時和需要多用戶訪問寫入時仍存在一定的不足??傊?,HDFS技術在市場潛力巨大的同時,還存在很多可以改善討論的地方,具有較高的研究價值。
關鍵詞:Hadoop;HDFS;block;namenode
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)01-0007-02
1 概述
隨著人們工作生活中數據量的不斷加大,個人電腦中單機存儲的體積也在不斷增大,與之相對應的,數據中心的數據壓力也在成倍增長;要存儲這些超大文件,可以對數據進行分區并存儲到網絡中若干單獨的計算機上,管理網絡中多臺計算機存儲的文件系統稱為分布式文件系統(Distributed Filesystem)。Hadoop的分布式系統稱為HDFS,即Hadoop Distributed Filesystem。
HDFS以流式數據訪問模式來存儲超大文件,即一次寫入,多次讀取的方式存取數據最佳:數據集通常由數據源生成或復制而成,接著長時間在此數據集上進行各種分析,這個數據源的寫入總是僅在文件的末尾添加數據,不支持多源寫入(以目前的技術,即使實現任意位置寫入等功能,效率也比較低)。Hadoop是設計運行在民用硬件(普通家用電腦)的集群上的,因此節點的故障率相對于昂貴的專用硬件較高,HDFS的作用就是當節點發生故障時,讓一般用戶察覺不到明顯的中斷。
2 HDFS數據塊
數據塊(block)是磁盤讀寫數據的最小單位,文件系統通過格式化硬盤,構造特有的磁盤塊來管理磁盤存儲,通常文件系統塊為幾k字節(Byte),而磁盤塊為512字節,常見的Windows服務器必須安裝在NTFS文件系統上,就是因為盡在這種文件系統上才支持服務器對磁盤的管理。HDFS也有塊的概念,默認為64MB,與常規文件系統類似,HDFS也將多個塊組合作為獨立的存儲單元(chunk),不同的是,當存儲文件小于塊大小時,不會獨占整個塊存儲空間。
之所以HDFS中的塊要大一些,是為了節省尋址開銷:眾所周知,在單機上頻繁進行硬盤讀寫操作后,容易產生磁盤存儲碎片,進而降低計算機整體運算速度,磁盤碎片整理的過程,其實質是將散亂存儲的數據,整理到磁盤相對集中的區域,從而減少磁頭尋址時間;同樣的,當單位數據塊較大時,磁盤讀取數據的效率也會明顯提高。假設尋址時間固定為10ms,傳輸速率為100MB/s,為了使尋址時間占傳輸時間的1%,應將塊大小設置為100MB,即1s內,首先用1/100s尋址,之后開始傳輸,由于數據塊有100MB,因此在傳輸完畢前無需再次尋址,這樣,就實現了1:100的高效傳輸,而通常情況下,HDFS也是使用128MB的塊設置。當然,塊的大小也不是越大越好,MapReduce中map任務每次只調用一個塊進行處理,當map任務數小于節點數量時,會造成大量節點閑置,反而降低了整體的處理速度。
利用這樣的塊結構,HDFS允許文件的大小大于網絡中任意一個磁盤的空間,因為文件的所有塊并不需要保存在一個磁盤上;其次,這樣的設計也使得存儲管理變得更加容易,由于單位塊的大小是固定的,文件管理系統很容易計算磁盤能夠容納多少塊,同時,每個塊只存儲一部分數據,而諸如文件權限等信息不需要與塊一同存儲,這樣,系統就能夠單獨管理這些信息;在容錯性方面,塊結構能夠有效實現數據的備份,HDFS默認將每個塊復制到三臺獨立的設備上,確保在設備發生故障,導致某個塊不可用時,從其他設備讀取其副本,保證數據的完整性。
3 namenode
HDFS中存在一個namenode(管理者)和多個datanode(工作者),其中namenode負責管理文件系統的命名,記錄所有文件和目錄,即永久存在于磁盤的命名空間鏡像文件和編輯日志文件,同時,它還負責臨時保存塊的位置信息??蛻敉ㄟ^文件系統接口訪問數據,其實質是在與namenode和datanode進行交互。
Datanode是文件系統的工作節點,它就像是人們的末梢神經一樣,為各項感知提供數據,而namenode就好像是人們的大腦,對神經的反饋進行綜合處理:datanode根據需要存儲并檢索數據庫,定期向namenode發送存儲塊的列表,而namenode負責記錄如何重建文件。namenode一旦損壞,整個文件系統將癱瘓,Hadoop為此提供兩種容錯機制:
1) 備份機制。
備份組成文件系統元數據持久狀態的文件:Hadoop可以同步將持久狀態寫入本地磁盤的同時,寫入一個遠程的網絡文件系統(NFS)
2) 輔助namenode
在另一臺單獨的計算機上運行一個輔助namenode,定期編輯日志合并命名空間鏡像,以防止編輯日志過大,它需要消耗與namenode同等的CPU和內存資源進行合并操作,并保存合并后的命名空間鏡像副本。
4 高可用性
通過以上兩種方法,依舊無法實現HDFS的高可用性,因為namenode是唯一存儲元數據與文件到數據塊映射的單元,當namenode失效時,所有客戶端均無法實現讀寫等操作。直到管理員建立一個新的namenode,并將命名空間的映像倒入內存,重新編輯日志,收到大量的來自datanode的數據塊報告并退出安全模式后,系統才能夠恢復,而對于大型數據集群來說,這種冷啟動需要30分鐘甚至更長的時間。
實際工作中,namenode失效的可能性非常低,Hadoop的2.X發行版本針對上述問題也在HDFS增加了對高可用性(HA)的支持,并做了如下修改:
1) namenode之間通過高可用的共享存儲實現編輯日志的共享,當備用namenode接管之后,將共享全部編輯日志,以實現與活動的namenode同步,并繼續讀取活動中的namenode的最新信息。
2) datanode向兩個namenode同時發送報告。
3) 客戶端用特定的透明機制處理namenode的失效問題。
由于最新的編輯日志和數據塊映射信息在內存條內,在活動的namenode失效后,備用namenode能夠在幾十秒內實現任務接管,實際過程中,為了等待系統確定namenode是否真的失效,失效時間大約在1分鐘左右。
5 結束語
HDFS(Hadoop Disttributed Filesystem)的以上種種表明,這是一種行之有效的大數據文件存儲系統,符合大數據的基本存儲需求,能夠實現數據的負載均衡存儲、存儲方法方便簡潔、可用性高、容錯性強。目前HDFS還存在包括上文所述在內的一些問題,部分問題解決的意義不大,部分問題仍需討論,但在可見的未來內,HDFS將持續保持自己的活力,并更加得到市場的認可。
參考文獻:
[1] 張子凡. OpenStack部署實踐[M].北京:人民郵電出版社,2014:1-364.
[2] 鮑亮,李倩. 實戰大數據[M].北京:清華大學出版社,2014:1-327.
[3] 吳萍,朱晴婷. 算法與程序設計基礎(Python版)[M].北京:清華大學出版社,2015:30-270.endprint