
在對NameNode節點進行格式化時,調用了FSImage的saveFSImage()方法和FSEditLog.createEditLogFile()存儲目前的中繼資料。Namenode主要維護兩個檔案,一個是fsimage,一個是editlog。
fsimage :儲存了最新的中繼資料檢查點,包含了整個HDFS檔案系統的所有目錄和檔案的資訊。對于檔案來說包括了資料塊描述資訊、修改時間、通路時間等;對于目錄來說包括修改時間、通路權限控制資訊(目錄所屬使用者,所在組)等。簡單的說,Fsimage就是在某一時刻,整個hdfs 的快照,就是這個時刻hdfs上所有的檔案塊和目錄,分别的狀态,位于哪些個datanode,各自的權限,各自的副本個數等。
注意:Block的位置資訊不會儲存到fsimage,Block儲存在哪個DataNode(由DataNode啟動時上報)。
editlog :主要是在NameNode已經啟動情況下對HDFS進行的各種更新操作進行記錄,HDFS用戶端執行所有的寫操作都會被記錄到editlog中。
讀取中繼資料:
啟動NameNode節點時,又要從鏡像和編輯日志中讀取中繼資料。
寫入中繼資料:
在NameNode運作時會将記憶體中的中繼資料資訊存儲到所指定的檔案,即${dfs.name.dir}/current目錄下的fsimage檔案,此外還會将另外一部分對NameNode更改的日志資訊存儲到${dfs.name.dir}/current目錄下的edits檔案中。fsimage檔案和edits檔案可以确定NameNode節點目前的狀态,這樣在NameNode節點由于突發原因崩潰時,可以根據這兩個檔案中的内容恢複到節點崩潰前的狀态,是以對NameNode節點中記憶體中繼資料的每次修改都必須儲存下來。但是如果每次都儲存到fsimage檔案中,這樣效率就特别低效,是以引入編輯日志檔案edits,儲存對對中繼資料的修改資訊,也就是fsimage檔案儲存NameNode節點中某一時刻記憶體中的中繼資料(即目錄樹),edits儲存這一時刻之後的對中繼資料的更改資訊。
鏡像的儲存:
SecondaryNameNode:主要由兩個作用,一是鏡像備份(不是NN的備份,但可以做備份),二是日志與鏡像的定期合并。
第一步:将hdfs更新記錄寫入一個新的檔案——edits.new。
第二步:将fsimage和editlog通過http協定發送至secondary namenode。
第三步:将fsimage與editlog合并,生成一個新的檔案——fsimage.ckpt。這步之是以要在secondary namenode中進行,是因為比較耗時,如果在namenode中進行,或導緻整個系統卡頓。
第四步:将生成的fsimage.ckpt通過http協定發送至namenode。
第五步:重命名fsimage.ckpt為fsimage,edits.new為edits。
第六步:等待下一次checkpoint觸發SecondaryNameNode進行工作,一直這樣循環操作。
注:checkpoint觸發的條件可以在core-site.xml檔案中進行配置。fs.checkpoint.period表示多長時間記錄一次hdfs的鏡像。預設是1小時。fs.checkpoint.size表示一次記錄多大的size,預設64M。例如如下:
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
<description>The number of seconds between two periodic checkpoints.
</description>
</property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
<description>The size of the current edit log (in bytes) that triggers
a periodic checkpoint even if the fs.checkpoint.period hasn't expired.
</property>
文章可以轉載,必須以連結形式标明出處。
本文轉自 張沖andy 部落格園部落格,原文連結:http://www.cnblogs.com/andy6/p/7353092.html ,如需轉載請自行聯系原作者