預知
HDFS是被Hadoop應用使用的一個主要的分布式存儲文件系統。一個HDFS集群主要由一個NameNode(管理文件系統元數據)和多個DataNode(存儲實際的數據)集成。HDFS的架構請參考我的另一篇文章。
HDFS啟動過程
NameNode會保存它的命名空間狀態信息到本地文件系統。
- fsimage:保存最后一次執行checkpoint時的命名空間狀態信息;
- etids:日志文件。保存最后一次checkpoint之后的命名空間信息修改變化的日志記錄。
- 當啟動HDFS的時候,會先啟動NameNode節點;NameNode從鏡像文件(fsimage文件)讀取HDFS狀態信息;
- 接著從日志記錄文件(editswenjian )加載狀態更新信息;
- 然后NameNode節點將HDFS的最新狀態寫入到fsimage文件(也就是將faimage文件和edits文件合并);
- 再重新創建一個新的空的日志文件來記錄文件修改等日志記錄。
其中,fsimage文件和edit日志記錄文件的位置可以在配置文件hdfs-core.xml中通過dfs.namenode.name.dir參數來指定。
由于NameNode只在啟動的時候合并fsimage和edits文件,所以當一個大的集群運行很久之后,edits日志文件就會變得很大,這就會影響在NameNode啟動時日志文件的讀取速度,從而延長了HDFS的啟動時間。這就引出了Secondary NameNode。
特性
Secondary NameNode(在1.0.4版本之后,可由Checkpoint Node替代)
Secondary NameNode會定期的合并fsimage和edits文件,并限制edits日志文件的大小在一定的范圍之內。Secondary NameNode通常運行在和NameNode不同的機器上。
Secondary NameNode執行這些操作主要由這兩個參數來控制:
- dfs.namenode.checkpoint.period: 兩次連續操作之間的時間間隔,默認1個小時;
- dfs.namenode.checkpoint.txns: 定義發生在NameNode上的最新事物數,默認一百萬個,優先級大于第一個。
Checkpoint Node
Checkpoint Node定期創建命名空間的checkpoint。從NameNode下載fsimage和edits文件到本地進行合并,并上傳行的鏡像文件給NameNode。Checkpoint Node一般也是運行于一臺不同的機器上面,可由命令bin/hdfs namenode -checkpoint啟動。Checkpoint node跟Secondary node一樣由相同的參數配置控制。
Backup Node
Backup Node除了提供跟Checkpoint Node一樣的功能外,它會在內存中運行一個最新的跟NameNode狀態同步的內存副本。Backup Node不需要從NameNode下載fsimage和edits日志文件來創建checkpoint(在CheckpointNode和SecondaryNode中可能需要);因為BackupNode總是有一個同NameNode一樣的內存副本。NameNode在同一時間只支持一個BackupNode節點;如果有一個BackupNode被使用,那么CheckpointNode是不能夠存在的。BackupNode的配置同CheckpointNode一樣,他又bin/hdfs namenode -backup命令啟動。
機架感知
典型的,一個大的Hadoop集群會被放在一個機群中,在這樣的機群中,比起跨機架來說,在相同的機架上網絡流量會更好。同時,NameNode也會放置不同的塊副本到不同的機架上來增強集群的容錯性能。集群管理員可以通過配置變量net.topology.script.file.name來決定節點所屬機架的策略。當這個腳本被配置后,每個節點都會運行這個腳本來決定自己所處的機架id。默認所有的節點都屬于同一個機架。
安全模式
NameNode啟動過程中,加載fsimage和edits文件,然后等待DataNode啟動并且向NameNode報告他們的狀態;這個時間段之間,NameNode就是出于安全模式。NameNode的安全模式實際就是HDFS處于只讀模式,在這個模式下所有的對文件系統的修改操作都不允許。在DataNode已經報告他們的文件塊可用之后,NameNode會自動從安全模式下解除。如果有需要,HDFS可以通過bin/hdfs dfsadmin -safemode命令來設置為安全模式狀態。