天天看點

10分鐘為你全面解答HDFS的SecondaryNamenode的作用

作者:好程式員IT教育

在HDFS相關的守護程序中,有NameNode程序、DataNode程序、SecondaryNameNode程序等。NameNode和DataNode職責比較明确,我們都知道是做什麼的,那麼SecondaryNameNode的作用是什麼呢?為什麼SecondayNameNode要和NameNode部署在不同的節點上呢?有人說SecondaryNameNode是NameNode的備份,這種說法正确嗎?我們來了解一下SecondaryNameNode是什麼,主要是做什麼工作的。

在正式的介紹SecondaryNameNode之前,我們先來認識兩種檔案: fsimage 和 eidts。我們都知道NameNode有一個作用就是維護HDFS分布式檔案系統的目錄樹結構。在HDFS上有什麼目錄、每一個目錄下又有什麼檔案等等,這些資訊是需要維護的。

NameNode在記憶體中維護檔案系統的目錄樹結構,而這樣的目錄樹結構随着HDFS的重新開機不會丢失,也就說明NameNode會将其序列化到本地磁盤上,以檔案的形式儲存下來。這個檔案就是fsimage檔案。我們可以在NameNode所在的節點發現這個檔案。

10分鐘為你全面解答HDFS的SecondaryNamenode的作用

那麼,是不是我們每次對HDFS進行操作的時候,NameNode都會将記憶體中記錄的HDFS的目錄樹結構序列化下來呢?顯然不應該是這樣的,因為如果你的檔案系統中的檔案比較多、比較複雜,在記憶體中維護的資料量也會比較龐大,我們假設1G。那麼如果每當對目錄樹結構産生了修改之後,都需要将記憶體中的資料序列化到磁盤上的話,就産生大量的磁盤IO。而且在序列化期間,如果NameNode當機的話,會出現資料丢失的情況。

是以,NameNode并不會實時的将每一次的變更都序列化到本地磁盤上。而是會周期性地進行序列化,一般來說一個小時序列化一次,生成fsimage檔案。那麼在這一個小時的時間之内,如果産生了新的檔案結構變更怎麼辦?這個時候,NameNode會将新的操作以edit log的形式儲存在檔案中,edit log中并不會儲存全部的目錄結構,而隻是記錄了某一次的變更操作。

10分鐘為你全面解答HDFS的SecondaryNamenode的作用

在NameNode啟動的時候,首先加載本地磁盤上的fsimage檔案,将一個完整的目錄結構讀取到記憶體中。然後再依次讀取每一個edit log中的記錄,在記憶體中進行推薦,對目錄樹結構進行推演。這樣就可以得到上次關機的時候完整的目錄樹結構。

10分鐘為你全面解答HDFS的SecondaryNamenode的作用

那麼,SecondaryNameNode是幹什麼的呢?上面提到了,NameNode會周期性的對記憶體中的目錄結構進行序列化,生成fsimage檔案。其實這個工作是由SecondaryNameNode來完成的。SecondaryNameNode會輔助NameNode進行fsimage和edit log的合并工作,減小editlog的大小,進而能夠縮減下一次啟動NameNode的時間。兩個檔案的合并周期,稱之為檢查點機制(checkpoint),是可以通過hdfs-default.xml配置檔案進行修改的:

<property>
    <name>dfs.namenode.checkpoint.period</name>
    <value>3600</value>
    <description>兩次檢查點間隔的秒數,預設是1個小時</description>
</property>		 
<property>
    <name>dfs.namenode.checkpoint.txns</name>
    <value>1000000</value>
    <description>txid執行的次數達到100w次,也執行checkpoint</description>
</property>		 
<property>
    <name>dfs.namenode.checkpoint.check.period</name>
    <value>60</value>
    <description>60秒一檢查txid的執行次數</description>
</property>           
10分鐘為你全面解答HDFS的SecondaryNamenode的作用

1. SecondaryNamenode請求Namenode停止使用正在編輯的editlog檔案,Namenode會建立新的editlog檔案,同時更新seed_txid檔案。

2. SecondaryNamenode通過HTTP協定擷取Namenode上的fsimage和editlog檔案。

3. SecondaryNamenode将fsimage讀進記憶體當中,并逐漸分析editlog檔案裡的資料,進行合并操作,然後寫入新檔案fsimage_x.ckpt檔案中。

4. SecondaryNamenode将新檔案fsimage_x.ckpt通過HTTP協定發送回Namenode。

5. Namenode再進行更名操作。

優秀的你與大廠之間隻差一個“好程式員”!