1、Hadoop Distributed File System整體架構
1)主從架構,單個namenode,多個datanode;
2)原始數據都被分成固定大小(最后一個block除外)的block存儲在各個DataNode上,namenode只負責存儲metadata:文件名、副本數、存儲在哪個DataNode等等信息,整個分布式文件系統(tǒng)的所有metadata組成存儲在namenode上的namespace,namespace和大多數文件系統(tǒng)類似,提供新建、刪除、移動、重命名等操作,namespace是一個樹形結構;
3)client讀獲取取數據,都是先從namenode獲取metadata,然后到對應的DataNode獲取需要的數據,目的是給namenode降壓,否則如果都從namenode來獲取原始數據的話,namenode就會成為最大的瓶頸。
2、namenode啟動過程
hdfs存儲metadata涉及兩個文件:FsImage和EditLog
FsImage存儲著整個文件系統(tǒng)的namespace,每個EditLog則記錄著每個block的每一次變更。
FsImage的生成:通過bin/hdfs namenode -format對namenode進行格式化的時候,會在namenode所在節(jié)點本地生成FsImage文件。
當通過sbin/start-dfs.sh第一次啟動文件系統(tǒng)的時候,系統(tǒng)會把FsImage讀取到內存中,而DataNode節(jié)點數據的相關變動,則保留在一系列的EditLog文件中,在下次(非第一次)文件系統(tǒng)重新啟動的時候,系統(tǒng)是先把目前的FsImage和所有的EditLog進行合并重新生成一個新的FsImage,然后讀取這個新的FsImage到內存中,這樣做是因為讀取FsImage的速率比讀取大量EditLog要快捷的多。
secondaryNameNode作用:在非第一次啟動namenode的時候,要對FsImage和EditLog進行合并處理,這個時候,如果上次服務器運行時間很長的話,那EditLog的數量將會非常大,這樣會導致合并的過程相當長,為了避免這個問題,HDFS系統(tǒng)會每隔一段時間(默認1小時,可配置)就對FsImage和EditLog進行合并操作,這個工作是由secondaryNameNode來完成的。