HDFS的系統組成介紹

一、HDFS框架簡述

HDFS設計目標

1)容錯性;

2)流式數據訪問;

3)大規模數據集;

4)簡單的一致性模型;

5)移動計算到數據附近;

6)可移植性;

二、HDFS分解簡述

NameNode/DataNode

HDFS採用Master/Slave架構,HDFS集羣是由一個NameNode和多個DataNodes組成。NameNode是中心服務器,負責管理文件系統的名字空間(namespace)以及客戶端的訪問。DataNode負責管理它所在節點上的存儲。用戶能夠通過HDFS文件系統的名字空間以文件的形式在上面存儲數據。

對於內部存儲,一個文件被切分爲一個或多個塊,存儲在一組DataNode上。NameNode執行文件系統的名字空間操作,比如打開、關閉、重命名文件或目錄。它也負責確定數據塊到具體DataNode節點的映射。

數據塊存儲副本容錯

HDFS文件的所有數據塊都會有副本。每個文件的數據塊大小和副本系數都是可配置的。HDFS中的文件都是一次性寫入的,並且在任何時候只能有一個寫入者。

NameNode全權管理數據塊的複製,它週期性地從集羣中的每個DataNode接收心跳信號和塊狀報告(Block Report)。

塊狀態報告包含了一個該DataNode上所有數據塊的列表。

副本放置策略

副本的放置策略是區分文件系統的重要特性之一,也是HDFS性能和可靠性的關鍵,HDFS採用了機架感知(rack-aware)的策略來存儲副本。

在大多數情況下,副本系數是3,HDFS的存放策略是將一個副本存放在本地機架的節點上,一個副本放在同一機架的另一個節點上,最後一個副本放在不同機架的節點上。這種策略減少了機架間的數據傳輸,這就提高了寫操作的效率。整個機架的錯誤遠遠比單個節點的錯誤少,所以這個策略不會影響到數據的可靠性和可用性。於此同時,因爲數據塊只放在兩個(不是三個)不同的機架上,所以此策略減少了讀取數據時需要的網絡傳輸總帶寬。在這種策略下,副本並不是均勻分佈在不同的機架上。三分之一的副本在一個節點上,三分之二的副本在一個機架上,如果大於3個副本,其他副本均勻分佈在剩下的機架中,這一策略在不損害數據可靠性和讀取性能的情況下改進了寫的性能。

機架感知

一個大型集羣大多會被分爲多個機架(Rack),一個機架包含多個節點,一般來說,機架內部機器的通信速度要高於機架之間的通信速度,而且往往機架之間的通信受到上層交換機等的帶寬限制。

HDFS中,對機架的感知並非是自適應的,即機架的配置是由配置文件決定,並且是人工指定的,這些rackid信息可以通過topology.script.file.name配置,通過IP到機架id的映射指定哪些節點屬於哪個機架,在NameNode啓動時將配置信息讀取到內存中,保存在一個map中。

通過機架感知,NameNode就可以畫出DataNode以及交換機等節點的網絡拓撲圖,通過拓撲圖就可以計算出任意兩個DataNode之間的距離,得到最優的存放策略,優化整個集羣的網絡帶寬均衡以及數據最優分配。

安全模式

安全模式是指NameNode的一種特殊狀態。處於安全模式的NameNode是不進行數據塊的複製的。NameNode從所有的 DataNode接收心跳信號和塊狀態報告。當Namenode檢測確認某個數據塊的副本數目達到該數據塊的最小副本數,那麼該數據塊會被認爲是副本安全(safely replicated)的。

Namenode退出安全模式狀態後,它會確定哪些數據塊的副本沒有達到指定數目,並將這些數據塊複製到其他DataNode上。

元數據持久化

HDFS通過dfs.name.dir這個參數設置HDFS的元數據信息存放在NameNode本地操作系統的目錄,目錄裏通常包括以下文件:edits FsImage FsTimeVERSION

EditLog

Namenodeedits文件來保存對元數據進行的每次操作,比如創建文件,刪除 文件,修改文件的副本系數。類似於mysql中的binlog機制。

SecondNameNode

SecondNamenode其實只是一個簡單的元數據備份 進程,它會定期(缺省是1小時)把edits文件的內容合併到fsimage文件,同時保存最新的元數據副本在SecondNamenode進程所在機器的文件系統裏。

FileImage

整個文件系統的名字空間,包括數據塊到文件的映射、文件的屬性等,都存儲在FsImage的文件中,FsImage結合edits才能準確表示內存中的元數據信息。

NameNode啓動時,它從硬盤中讀取EditlogFsImage,將所有Editlog中的事務作用合併到內存中的FsImage上,並將這個新版本的FsImage從內存中保存到本地磁盤上,然後刪除舊的Editlog,因爲這個舊的Editlog的事務都已經作用在FsImage上了。這個過程稱爲一個檢查點(checkpoint),在當前實現中,檢查點只發生在NameNode啓動時,在不久的將來將實現支持週期性的檢查點,此時這個時候系統處於安全模式,NameNode等待DataNode上報各自的block 數據塊信息。

Format HDFS系統

hadoop namenode -format命令用來初始化HDFS系統,事實就是初始化dfs.name.dir目錄中的四個文件editsFsImageFsTime VERSION

故障容錯

DataNode數據複製

每個DataNode週期性地向NameNode發送心跳。網絡割裂可能導致部分DataNodeNameNode失去聯繫。NameNode將近期不發送心跳信號DataNode標記爲宕機,不會再將新的IO請求發給它們。NameNode通過複製操作將新的副本複製到有效的DataNode

在下列情況下,可能需要重新複製:某個DataNode節點失效,某個副本遭到損壞,DataNode上的硬盤錯誤,或者文件的副本系數增大。

集羣均衡

HDFS的架構支持數據均衡策略。如果某個DataNode節點上的空閒空間低於特定的臨界點,系統就會自動地將數據從該DataNode移動到其他DataNode。當對某個文件的請求突然增加,那麼也可能啓動一個計劃創建該文件新的副本,並且同時重新平衡集羣中的其他數據。這些均衡策略目前還沒有實現。

數據完整性

HDFS客戶端實現了對HDFS文件內容的校驗和(checksum)檢查。當客戶端創建一個新的HDFS文件,會計算這個文件每個數據塊的校驗和,並將校驗和作爲一個單獨的隱藏文件保存在同一個HDFS名字空間下。當客戶端獲取文件內容後,它會校驗文件的完整性,如果數據錯誤,客戶端可以選擇從其他DataNode獲取該數據塊的副本。

元數據錯誤

FsImageEditlogHDFS的核心數據結構,如果損壞了,整個HDFS都將失效。因而,NameNode可以配置成支持維護多個FsImageEditlog的副本。任何對FsImage或者Editlog的修改,都將同步到它們的副本上。這種多副本的同步操作可能會降低NameNode每秒處理的名字空間事務數量。然而這個代價是可以接受的,因爲即使HDFS的應用是數據密集的,它們也非元數據密集的。當NameNode重啓的時候,它會選取最近的完整的FsImageEditlog來使用。

NameNodeHDFS集羣中的單點故障(single point of failure)所在。如果NameNode機器故障,是需要手工干預的。目前,自動重啓或在另一臺機器上做NameNode故障轉移的功能還沒實現。

快照

快照支持某一特定時刻的數據的複製備份。利用快照,可以讓HDFS在數據損壞時恢復到過去一個已知正確的時間點。HDFS目前還不支持快照功能,但計劃在將來的版本進行支持。

數據模型

數據分段

創建文件時以及寫數據時,客戶端的請求其實並沒有立即發送給NameNode,事實上,HDFS客戶端會先將文件數據緩存到本地的一個臨時文件。寫操作被透明地重定向到這個臨時文,當臨時文件的數據量超過一個數據塊的大小,客戶端纔會聯繫NameNodeNameNode將文件名插入文件系統的層次結構中,並且分配一個數據塊給它。然後返回DataNode的標識符和目標數據塊給客戶端。客戶端再將數據從本地臨時文件上傳到指定的DataNode上。

當文件關閉時,在臨時文件中沒有上傳的數據也會傳輸到指定的DataNode上,客戶端會告訴NameNode文件已經關閉。此時NameNode纔將文件創建操作提交到日誌裏進行存儲。如果NameNode在文件關閉前宕機了,則該文件將丟失。

上述方法是對在HDFS上運行的目標應用進行認真考慮後得到的結果。這些應用需要進行文件的流式寫入。如果不採用客戶端緩存,由於網絡速度和網絡堵塞會對吞估量造成比較大的影響。

流水線複製

客戶端向HDFS文件寫入數據時,首先寫入本地臨時文件,假設該文件的副本系數爲3,當本地臨時文件累積到一個數據塊的大小時,客戶端會從NameNode獲取一個DataNode列表用於存放副本,然後客戶端向第一個DataNode傳輸數據,第一個DataNode一小部分一小部分(4 KB)地接收數據並寫入本地倉庫,並同時傳輸該部分到列表中第二個DataNode節點。第二個DataNode接收數據,並同時傳給第三個DataNode。因此,DataNode能流水線式地從前一個節點接收數據,並在同時轉發給下一個節點,數據以流水線的方式從前一個DataNode複製到下一個

簡單一致性模型

HDFS主要應用於大規模的數據處理,一個數據集通常由數據源生成或複製,在此基礎上進行各種分析。每個分析至少都會涉及數據集中的大部分數據 (甚至全部),因此讀取整個數據集的時間比讀取第一條記錄的延遲更爲重要。

因此HDFS對文件操作需要的是一次寫入,多次讀取的。一個文件一旦創建、寫入、關閉之後就不需要修改了。這個假定簡化了數據一致的問題和高吞吐量的數據訪問。文件的修改、寫操作只能append(),在文件的末尾增加,它不支持在文件的任意位置修改。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章