Hadoop學習之SecondaryNameNode

在啓動Hadoop時,NameNode節點上會默認啓動一個SecondaryNameNode進程,使用JSP命令能夠查看到。SecondaryNameNode光從字面上理解,很容易讓人認爲是NameNode的熱備進程。其實不是,SecondaryNameNode是HDFS架構中的一個組成部分。它並非元數據節點出現問題時的備用節點,它和元數據節點負責不一樣的事情。node

 

一、SecondaryNameNode節點的用途:架構

簡單的說,SecondaryNameNode節點的主要功能是週期性將元數據節點的命名空間鏡像文件和修改日誌進行合併,以防日誌文件過大。分佈式

 

 

要理解SecondaryNameNode的功能,首先咱們先來了解下NameNode的主要工做:oop

二、NameNode節點的主要工做:post

NameNode的主要功能之一是用來管理文件系統的命名空間,其將全部的文件和文件目錄的元數據保存在一個文件系統樹中。爲了保證交互速度,NameNode會在內存中保存這些元數據信息,但同時也會將這些信息保存到硬盤上進行持久化存儲,一般會被保存成如下文件:命名空間鏡像文件(fsimage)和修改日誌文件(edits)。下圖是NameNode節點上的文件目錄結構:3d

wKiom1OSfhvSkAAcAAAnqIht8bE706.jpg

fsimage文件,也即命名空間映像文件,是內存中的元數據在硬盤上的checkpoint,它是一種序列化的格式,並不可以在硬盤上直接修改。日誌

有了這兩個文件後,Hadoop在重啓時就能夠根據這兩個文件來進行狀態恢復,fsimage至關於一個checkpoint,因此當Hadoop重啓時須要兩個文件:fsimage+edits,首先將最新的checkpoint的元數據信息從fsimage中加載到內存,而後逐一執行edits修改日誌文件中的操做以恢復到重啓以前的最終狀態。xml

Hadoop的持久化過程是將上一次checkpoint之後最近一段時間的操做保存到修改日誌文件edits中。blog

 

這裏出現的一個問題是edits會隨着時間增長而愈來愈大,致使之後重啓時須要花費很長的時間來按照edits中記錄的操做進行恢復。因此Hadoop用到了SecondaryNameNode,它就是用來幫助元數據節點將內存中的元數據信息checkpoint到硬盤上的。進程

 

三、SecondaryNameNode工做流程:

  • SecondaryNameNode節點通知NameNode節點生成新的日誌文件,之後的日誌都寫到新的日誌文件中。

  • SecondaryNameNode節點用http get從NameNode節點得到fsimage文件及舊的日誌文件。

  • SecondaryNameNode節點將fsimage文件加載到內存中,並執行日誌文件中的操做,而後生成新的fsimage文件。

  • SecondaryNameNode節點將新的fsimage文件用http post傳回NameNode節點上。

  • NameNode節點能夠將舊的fsimage文件及舊的日誌文件,換爲新的fsimage文件和新的日誌文件(第一步生成的),而後更新fstime文件,寫入這次checkpoint的時間。

  • 這樣NameNode節點中的fsimage文件保存了最新的checkpoint的元數據信息,日誌文件也從新開始,不會變的很大了。

  • 流程圖以下所示:

wKiom1OSgRaDTnQyAAHtiGS9Pvg733.jpg

 

四、SecondaryNameNode運行在另一臺非NameNode的 機器上

SecondaryNameNode進程默認是運行在NameNode節點的機器上的,若是這臺機器出錯,宕機,對恢復HDFS文件系統是很大的災難,更好的方式是:將SecondaryNameNode的進程配置在另一臺機器 上運行。至於爲何要將SNN進程運行在一臺非NameNode的 機器上,這主要出於兩點考慮:

可擴展性: 建立一個新的HDFS的snapshot須要將namenode中load到內存的metadata信息所有拷貝一遍,這樣的操做須要的內存就須要 和namenode佔用的內存同樣,因爲分配給namenode進程的內存實際上是對HDFS文件系統的限制,若是分佈式文件系統很是的大,那麼namenode那臺機器的內存就可能會被namenode進程所有佔據。

容錯性: 當snn建立一個checkpoint的時候,它會將checkpoint拷貝成metadata的幾個拷貝。將這個操做運行到另一臺機器,還能夠提供分佈式文件系統的容錯性。

 

 

五、配置將SecondaryNameNode運行在另外一臺機器上:

HDFS的一次運行實例是經過在namenode機器上的$HADOOP_HOME/bin/start-dfs.sh( 或者start-all.sh ) 腳原本啓動的。這個腳本會在運行該腳本的機器上啓動 namenode進程,而slaves機器上都會啓動DataNode進程,slave機器的列表保存在 conf/slaves文件中,一行一臺機器。而且會在另一臺機器上啓動一個SecondaryNameNode進程,這臺機器由conf/masters文件指定。因此,這裏須要嚴格注意, conf/masters 文件中指定的機器,並非說jobtracker或者namenode進程要 運行在這臺機器上,由於這些進程是運行在 launch bin/start-dfs.sh或者 bin/start-mapred.sh(start-all.sh)的機器上的。因此,masters這個文件名是很是的使人混淆的,應該叫作secondaries會比較合適。而後,經過如下步驟:

 

  1. 將全部想要運行secondarynamenode進程的機器寫到masters文件中,一行一臺。

  2. 修改在masters文件中配置了的機器上的conf/hadoop-site.xml文件,加上以下選項:

    <property>
        <name>dfs.http.address</name>
        <value> :50070</value>
     </property>
相關文章
相關標籤/搜索