http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html Introduction Hadoop分散式文件系統被設計運行在普通的硬體上。它和目前已經存在的分散式文件系統有很多相似的地方。然 ...
http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
Introduction
Hadoop分散式文件系統被設計運行在普通的硬體上。它和目前已經存在的分散式文件系統有很多相似的地方。然而,也有很多不同。HDFS的容錯性很高,並且被設計用來運行在廉價的硬體上。HDFS提供高吞吐量的訪問應用數據,並且適合用在有很大數據集的應用。HDFS是構建Apache Nutch的基礎設施。HDFS是Apache Hadoop核心工程的一部分。
Assumptions and Goals
Hardware Failure
硬體失敗是一種正常情況而不是異常情況。一個HDFS實例可能由成千上萬台伺服器機器組成,每台機器都存儲著這個文件系統上的一部分數據。事實上有許多組件,每個組件失敗的概率很大,這就意味著HDFS總是不穩定的。因此,快速刪除錯誤的組件,並且自動發現它們是HDFS的一個核心架構目標。
NameNode and DataNodes
HDFS是一個主從結構。一個HDFS集群由一個NameNode和許多個DataNode組成。NameNode是一個主伺服器,它管理文件系統的命名空間,並且客戶端對文件的訪問。DataNode管理與之相關的節點的存儲。HDFS維護一個文件系統的命名空間,並且允許用戶數據以文件形式存儲。在內部,一個文件被切分成一個或多個塊,這些塊被存儲在一系列的DataNode上。NameNode執行文件系統命名空間操作,比如:打開、管理、重命名文件或目錄。它也維護著塊到DataNode之間的映射關係。DataNode負責為這些來自文件系統客戶端的請求提供讀寫服務。在NameNode指定之下,DataNode也執行塊的創建、刪除、複製操作。
HDFS是用Java語言構建的,任何一個支持Java的機器上都可以運行NameNode和DataNode軟體。一種典型的部署方式是用一臺專門的機器上面只部署NameNode,而這個實例集群中的其它的每一個集群上都運行一個DataNode。HDFS這種架構不能阻止在同一臺集群上運行多個DataNode,但這種情況在真實的部署中是很少見的。
The File System Namespace
HDFS的文件系統命名空間和已經存在的其它的文件系統很類似,可以創建、刪除、移動文件或目錄。HDFS支持用戶限額和訪問許可權控制。HDFS不支持硬鏈接和軟鏈接,然而它並沒有阻止這種特性的實現。
NameNode維護文件系統命名空間。任何對文件系統命名空間或者它們的屬性的修改都會記錄到NameNode中。一個應用可以指定一個文件在HDFS中應該維護的副本的數量。一個文件副本的數量叫做這個文件的副本因數,這個信息被存儲在NameNode中。
Data Replication
每個文件被存儲為一系列的塊。為了容錯,文件的每個塊會被覆制。塊的大小和副本因數被配置在每個文件中。在一個文件的所有塊中,除了最後一個塊以外,其餘的塊的大小都相同。應用程式可以指定一個文件的副本數量。在文件被創建的時候副本因數就被指定了,當然在隨後可以修改。在HDFS中的文件都是只能寫一次的,而且在任何時候都是嚴格的只能寫一次。(PS:也就是說寫入了就不能改了,如果想要改則需要先下載本地修改後重新上傳)
NameNode會周期性的接收到來自集群中的每個DataNode的心跳檢測和塊報告。收到心跳檢測意味著這個DataNode還活著可以正常提供服務。一個塊報告包含這個DataNode上的所有的塊列表。
Replica Placement: The First Baby Steps
副本存放的位置對HDFS的可靠性和性能至關重要。最佳的副本位置是HDFS區別與其它分散式文件系統的重要標誌。這個特性需要大量的調試和實驗。機架感知副本位置策略的目的是為了提高數據的可靠性、可用性和網路帶寬的利用率。
一個大的HDFS集群實例由許多電腦組成,這些電腦通常被放在許多機架上。不同機架上的兩台電腦之間通信必須通過交換機。大多數情況下,相同機架上的機器之間的網路帶寬要比不通機架上機器之前的網路帶寬要好很多。
NameNode決定DataNode所屬的機架ID
通常情況下,副本因數是3。HDFS的放置策略是,如果是第一次寫在某個DataNode上,那麼就放置一個副本在這個DataNode所在的本地機器上,否則放置在相同機架上的一個隨機的DataNode上,其它的副本放置在不同的遠程機架上的某個節點,最後一個副本放置在相同的遠程機架上的不同的節點上。機架失敗的概率要比機架上某個節點失敗的概率小很多。這個策略不影響數據的可靠性和可用性。
如果副本因數大於3,那麼第4個以及後面的更多的副本的位置是隨機決定的,但是每個機架上的副本數量有一個上限((replicas - 1) / racks + 2)
The Persistence of File System Metadata
NameNode用一個叫做EditLog的事務日誌來持久化文件系統元數據的每一次改變。例如,在HDFS上創建一個新文件會造成NameNode插入一條記錄到EditLog中。同樣的,改變一個文件的副本因數也會造成往EditLog中插入一條記錄。NameNode用它所在的主機的本地操作系統上的一個文件來存儲EditLog。整個文件系統命名空間,包括塊到文件的映射,以及文件的系統屬性,都會被存儲到一個叫做FsImage的文件中。這個FsImage文件也被存儲在NameNode的本地文件系統中。
NameNode在記憶體中保持整個文件系統命名空間以及文件塊的映射。當NameNode啟動的時候,或者當檢查點被觸發的時候,它會從磁碟中讀取FsImage和EditLog,然後根據EditLog構建所有的事務到記憶體中的FsImage,並且刷新新的版本到一個新的FsImage到磁碟。它會截斷舊的EditLog,因為這些EditLog中的事務已經被持久化到FsImage中了。這個處理被叫做檢查點。檢查點的目的在於通過做一個文件系統元數據的快照並且把它們保存到FsImage中來確保HDFS可以很方便的查看文件系統元數據。代替每編輯一次就修改FsImage,我們將這個編輯持久化到EditLog。當檢查點發生的時候,將改變從EditLog寫到FsImage。一個檢查點被觸發在給定的時間間隔(dfs.namenode.checkpoint.period)單位是秒,或者指定文件系統事務累積達到多少數量(dfs.namenode.checkpoint.txns)就觸發。如果這兩個屬性都設置了,那麼第一個達到閾值的將觸發檢查點。
DataNode將文件數據存放在本地文件系統中。DataNode並不知道HDFS的文件,它只是將文件的每個塊存儲到本地文件系統中。DataNode並不是將所有的文件都存在一個目錄下,它會以一種啟髮式的方式來決定每個目錄下該存放的文件的最優數量,並且也會適當的創建子目錄。當DataNode啟動的時候,它通過掃描本地文件系統生成一個和這個本地文件一致的HDFS數據塊的列表,並且發送報告給NameNode。這個報告叫做Blockreport。
總結一下:
1、每次元數據的改變都會被記錄到EditLog中
2、文件的元數據已經文件和Block直接的映射關係被記錄到FsImage中
3、改變不會理解寫到FsImage中,而是先記錄到EditLog中,然後當檢查點觸發的時候將EditLog中記錄的改變寫到FsImage中
4、檢查點觸發的時機有兩個:一個是可以通過dfs.namenode.checkpoint.period參數指定多長時間周期性的觸發一次,另一個是通過dfs.namenode.checkpoint.txns指定當EditLog中的記錄達到多少時觸發一次。無論達到那個條件都會觸發,誰先達到,誰先觸發
5、EditLog和FsImage都存放在NameNode所在的機器的本地磁碟上
6、DataNode啟動的時候回發送BlockReport給NameNode