NN與2NN工做機制
思考:NameNode中的元數據是存儲在哪裏的?node
- 假設存儲在NameNode節點的硬盤中,由於常常須要隨機訪問和響應客戶請求,必然效率過低,因此是存儲在內存中的
- 可是,若是存儲在內存中,一旦斷電,元數據丟失,整個集羣便沒法工做,所以會在硬盤中產生備份元數據的Fsimage
- 可是這樣又會有新的問題出現,當內存中的元數據更新時,須要同時更新Fsimage,不然會發生一致性的問題;
- 但要更新的話,又會致使效率太低
- 所以,又引入了Edits文件,用來記錄客戶端更新元數據的每一步操做(只進行追加操做,效率很高),每當元數據有更新時,就把更新的操做記錄到Edits中,Edits也存放在硬盤中
- 這樣,一旦NameNode節點斷電,能夠經過Fsimage和Edits合併,生成最新的元數據
- 若是長時間一直添加操做數據到Edits,會致使文件數據過大,效率下降,而一旦斷電會形成恢復時間過長,所以須要對Fsimage與Edits按期合併
- 而若是這些操做都交給NameNode節點完成,則又會形成效率下降
- 所以引入了一個輔助NameNode的新的節點SecondaryNameNode,專門用於Fsimage和Edits的合併
NN與2NN工做機制安全
![1 1](http://static.javashuo.com/static/loading.gif)
- 第一階段:NameNode啓動
- 第一次啓動NameNode格式化以後,建立Fsimage,Edits文件實在啓動NameNode時生成的;若是不是第一次建立,會直接加載Edits和Fsimage到內存,在HDFS啓動時會有一次Edits和Fsimage的合併操做,此時NameNode內存就持有最新的元數據信息
- 客戶端對元數據發送增刪改(不記錄查詢操做,由於查詢不改變元數據)的請求
- NameNode會首先記錄操做日誌,,更新滾動日誌
- NameNode在內存中對元數據進行增刪改操做
- 第二階段:SecondaryNameNode工做
- SecondaryNameNode按期詢問NameNode是否須要CheckPoint,直接帶回NameNode是否檢查的結果
- 當CheckPoint定時時間到了或者Edits中的數據滿了,SecondaryNameNode請求執行CheckPoint
- NameNode滾動正在寫的Edits,並生成新的空的edits.inprogress002,滾動的目的是給Edits打個標記,之後全部更新操做都寫入edits.inprogress002中
- 原來的Fsimage和Edits文件會拷貝到SecondaryNameNode節點,SecondaryNameNode會將它們加載到內存合併,生成新的鏡像文件fsimage.chkpoint
- 而後將新的鏡像文件fsimage.chkpoint拷貝給NameNode,重命名爲Fsimage,替換原來的鏡像文件
- 所以,最後當NameNode啓動時,只須要加載以前未合併的Edits和Fsimage便可更新到最新的元數據信息
Fsimage與Edits解析
1. NameNode在格式化以後,將在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current/
目錄下產生以下文件:oop
-rw-rw-r--. 1 kocdaniel kocdaniel 945 9月 25 20:27 fsimage_0000000000000000000
-rw-rw-r--. 1 kocdaniel kocdaniel 62 9月 25 20:27 fsimage_0000000000000000000.md5
-rw-rw-r--. 1 kocdaniel kocdaniel 4 9月 25 20:27 seen_txid
-rw-rw-r--. 1 kocdaniel kocdaniel 205 9月 25 10:25 VERSION複製代碼
- fsimage:HDFS文件系統元數據的一個永久性的檢查點,其中包含HDFS文件系統的全部目錄和文件inode的序列化信息
- Edits(啓動NameNode時生成):存放HDFS文件系統全部更新操做,文件系統客戶端執行的寫操做首先會被記錄到Edits文件中
- seentxis:保存的時一個數字,是最新的edits後的數字
- 每次NameNode啓動的時候都會將Fsimage文件讀入內存,加載Edits文件裏的更新操做,保證內存中元數據的內容是最新的,同步的
2. oiv查看Fsimage文件spa
- 基本語法:
hdfs oiv -p 文件類型 -i 鏡像文件 -o 轉換後文件輸出路徑
3. oev查看Edits文件3d
- 基本語法:
hdfs oev -p 文件類型 -i 編輯日誌 -o 轉換後文件輸出路徑
Checkpoint時間設置
默認狀況下,SecondaryNameNode每隔一個小時或者當操做次數超過100萬次時執行一次,可是操做次數的統計SecondaryNameNode本身作不到,須要藉助NameNode,因此還有一個參數設置是namenode每隔一分鐘檢查一次操做次數,當操做次數達到100萬時SecondaryNameNode開始執行Checkpoint,三個參數的設置都在hdfs_site.xml配置文件中,配置以下:日誌
# SecondaryNameNode每隔一個小時執行一次
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
# SecondaryNameNode當操做次數超過100萬次時執行一次
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操做動做次數</description>
</property>
# NameNode一分鐘檢查一次操做次數
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分鐘檢查一次操做次數</description>
</property >
複製代碼
NameNode故障處理
NameNode故障後有兩種處理方式:code
NameNode故障處理方式一:直接將SecondaryNameNode目錄下的數據直接拷貝到NameNode目錄下,而後從新啓動NameNodecdn
NameNode故障處理方式二:使用-importCheckpoint選項啓動NameNode守護進程,從而將SecondaryNameNode目錄下的數據直接拷貝到NameNode目錄下xml
- 首先須要在hdfs_site.xml文件中添加以下配置
# SecondaryNameNode每隔兩分鐘執行一次
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</value>
</property>
# 指定namenode生成的文件目錄
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value>
</property>
複製代碼
- 而後,若是SecondaryNameNode和NameNode不在一個主機節點上,須要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件
- 最後導入檢查點數據(等待一下子ctrl + c結束掉)
[kocdaniel@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint複製代碼
- 注意:執行完該命令後,觀察namenode已經啓動(臨時啓動),並且每2分鐘檢查一次,若是肯定已經恢復了數據,咱們ctrl+c中止,而後本身手動起namenode
- ctrl+c以後,重啓namenode便可恢復數據,可是並不能徹底恢復,可能會將最新的Edits文件中的操做丟失
集羣安全模式
什麼是安全模式
- NameNode啓動時,首先將Fsimage載入內存,再執行Edits中的各項操做,一旦在內存中成功創建文件系統元數據的映像,則建立一個新的Fsimage文件和一個空的編輯日誌,而後開始監聽DataNode請求,在這個過程期間,NameNode一直運行在安全模式下,也就是NameNode對於客戶端是隻讀的
- DataNode啓動時,系統中的數據塊的位置並非由NameNode維護的,而是由塊列表的形式存儲在DataNode中,在系統的正常操做期間,NameNode會在內存中保留全部塊的映射信息。在安全模式下,各個DataNode會向NameNode發送最新的塊列表信息,NameNode瞭解足夠多的塊列表信息後,便可高效運行文件系統
- 安全模式退出判斷:若是知足最小副本條件,NameNode會在30秒以後退出安全模式。最小副本條件是指在整個文件系統中99.9%的塊知足最小副本級別(默認爲1),即99.9%的塊至少有一個副本存在。
- 在啓動一個剛剛格式化的HDFS集羣時,因爲系統中尚未任何塊,因此NameNode不會進入安全模式
基本語法
- 集羣處於安全模式時,不能執行任何重要操做(寫操做)。
- 集羣啓動完成後,自動退出安全模式
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態)
# wait是指,若是在腳本中寫入此命令,則腳本將等待安全模式退出後自動執行
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態)複製代碼
NameNode多目錄配置
- NameNode的本地目錄能夠配置成多個,且每一個目錄存放內容相同,增長了可靠性,提升高可用性
- 具體須要在hdfs_site.xml中加入以下配置:
# 指定目錄的路徑
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>複製代碼
歡迎關注下方公衆號,獲取更多文章信息