Hadoop學習之SecondaryNameNode

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


1、SecondaryNameNode節點的用途:

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



要理解SecondaryNameNode的功能,首先我們先來了解下NameNode的主要工作:

2、NameNode節點的主要工作:

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

wKiom1OSfhvSkAAcAAAnqIht8bE706.jpg

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

有了這兩個文件後,Hadoop在重啓時就可以根據這兩個文件來進行狀態恢復,fsimage相當於一個checkpoint,所以當Hadoop重啓時需要兩個文件:fsimage+edits,首先將最新的checkpoint的元數據信息從fsimage中加載到內存,然後逐一執行edits修改日誌文件中的操作以恢復到重啓之前的最終狀態。

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


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


3、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


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

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

可擴展性: 創建一個新的HDFS的snapshot需要將namenode中load到內存的metadata信息全部拷貝一遍,這樣的操作需要的內存就需要 和namenode佔用的內存一樣,由於分配給namenode進程的內存其實是對HDFS文件系統的限制,如果分佈式文件系統非常的大,那麼namenode那臺機器的內存就可能會被namenode進程全部佔據。

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



5、配置將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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章