NameNode和SecondaryNameNode詳解

一、NN和2NN工作機制

NN和2NN工作機制,如圖
NN和2NN工作機制

1.第一階段:NameNode啓動
(1)第一次啓動NameNode格式化後,創建fsimage和edits文件。
    如果不是第一次啓動,直接加載編輯日誌和鏡像文件到內存。
(2)客戶端對元數據進行增刪改的請求。
(3)NameNode記錄操作日誌,更新滾動日誌。
(4)NameNode在內存中對數據進行增刪改查。
2.第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要checkpoint。
    直接帶回NameNode是否檢查結果。
(2)Secondary NameNode請求執行checkpoint。
(3)NameNode滾動正在寫的edits日誌。
(4)將滾動前的編輯日誌和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日誌和鏡像文件到內存,併合並。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
NN和2NN工作機制詳解:

Fsimage:namenode內存中元數據序列化後形成的文件。
Edits:記錄客戶端更新元數據信息的每一步操作(可通過Edits運算出元數據)。
namenode啓動時,先滾動edits並生成一個空的edits.inprogress,然後加載edits和fsimage到內存中,此時namenode內存就持有最新的元數據信息。client開始對namenode發送元數據的增刪改查的請求,這些請求的操作首先會被記錄的edits.inprogress中(查詢元數據的操作不會被記錄在edits中,因爲查詢操作不會更改元數據信息),如果此時namenode掛掉,重啓後會從edits中讀取元數據的信息。然後,namenode會在內存中執行元數據的增刪改查的操作。
由於edits中記錄的操作會越來越多,edits文件會越來越大,導致namenode在啓動加載edits時會很慢,所以需要對edits和fsimage進行合併(所謂合併,就是將edits和fsimage加載到內存中,照着edits中的操作一步步執行,最終形成新的fsimage)。secondarynamenode的作用就是幫助namenode進行edits和fsimage的合併工作。
secondarynamenode首先會詢問namenode是否需要checkpoint(觸發checkpoint需要滿足兩個條件中的任意一個,定時時間到和edits中數據寫滿了)。直接帶回namenode是否檢查結果。secondarynamenode執行checkpoint操作,首先會讓namenode滾動edits並生成一個空的edits.inprogress,滾動edits的目的是給edits打個標記,以後所有新的操作都寫入edits.inprogress,其他未合併的edits和fsimage會拷貝到secondarynamenode的本地,然後將拷貝的edits和fsimage加載到內存中進行合併,生成fsimage.chkpoint,然後將fsimage.chkpoint拷貝給namenode,重命名爲fsimage後替換掉原來的fsimage。namenode在啓動時就只需要加載之前未合併的edits和fsimage即可,因爲合併過的edits中的元數據信息已經被記錄在fsimage中。

二、Fsimage和Edits解析

1.概念

  namenode被格式化之後,將在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current目錄中產生如下文件

fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION

(1)Fsimage文件:HDFS文件系統元數據的一個永久性的檢查點,其中包含HDFS文件系統的所有目錄和文件idnode的序列化信息。
(2)Edits文件:存放HDFS文件系統的所有更新操作的路徑,文件系統客戶端執行的所有寫操作首先會被記錄到edits文件中。
(3)seen_txid文件保存的是一個數字,就是最後一個edits_的數字
(4)每次NameNode啓動的時候都會將fsimage文件讀入內存,加載edits裏面的更新操作,保證內存中的元數據信息是最新的、同步的,可以看成NameNode啓動的時候就將fsimage和edits文件進行了合併。

2.oiv查看fsimage文件

(1)查看oiv和oev命令

[admin@hadoop102 current]$ hdfs
oiv               apply the offline fsimage viewer to an fsimage
oev               apply the offline edits viewer to an edits file

(2)基本語法

hdfs oiv -p 文件類型 -i鏡像文件 -o 轉換後文件輸出路徑

(3)舉個栗子

[admin@hadoop102 current]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current
[admin@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
[admin@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/fsimage.xml

  將顯示的xml文件內容拷貝到eclipse中創建的xml文件中,並格式化。部分顯示結果如下。

<inode>
    <id>16386</id>
    <type>DIRECTORY</type>
    <name>user</name>
    <mtime>1512722284477</mtime>
    <permission>admin:supergroup:rwxr-xr-x</permission>
    <nsquota>-1</nsquota>
    <dsquota>-1</dsquota>
</inode>
<inode>
    <id>16387</id>
    <type>DIRECTORY</type>
    <name>admin</name>
    <mtime>1512790549080</mtime>
    <permission>admin:supergroup:rwxr-xr-x</permission>
    <nsquota>-1</nsquota>
    <dsquota>-1</dsquota>
</inode>
<inode>
    <id>16389</id>
    <type>FILE</type>
    <name>wc.input</name>
    <replication>3</replication>
    <mtime>1512722322219</mtime>
    <atime>1512722321610</atime>
    <perferredBlockSize>134217728</perferredBlockSize>
    <permission>admin:supergroup:rw-r--r--</permission>
    <blocks>
        <block>
            <id>1073741825</id>
            <genstamp>1001</genstamp>
            <numBytes>59</numBytes>
        </block>
    </blocks>
</inode >
3.oev查看edits文件

(1)基本語法

hdfs oev -p 文件類型 -i編輯日誌 -o 轉換後文件輸出路徑

(2)舉個栗子

[admin@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
[admin@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/edits.xml

  將顯示的xml文件內容拷貝到eclipse中創建的xml文件中,並格式化。顯示結果如下。

<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
    <EDITS_VERSION>-63</EDITS_VERSION>
    <RECORD>
        <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
        <DATA>
            <TXID>129</TXID>
        </DATA>
    </RECORD>
    <RECORD>
        <OPCODE>OP_ADD</OPCODE>
        <DATA>
            <TXID>130</TXID>
            <LENGTH>0</LENGTH>
            <INODEID>16407</INODEID>
            <PATH>/hello7.txt</PATH>
            <REPLICATION>2</REPLICATION>
            <MTIME>1512943607866</MTIME>
            <ATIME>1512943607866</ATIME>
            <BLOCKSIZE>134217728</BLOCKSIZE>
            <CLIENT_NAME>DFSClient_NONMAPREDUCE_-1544295051_1</CLIENT_NAME>
            <CLIENT_MACHINE>192.168.1.5</CLIENT_MACHINE>
            <OVERWRITE>true</OVERWRITE>
            <PERMISSION_STATUS>
                <USERNAME>admin</USERNAME>
                <GROUPNAME>supergroup</GROUPNAME>
                <MODE>420</MODE>
            </PERMISSION_STATUS>
            <RPC_CLIENTID>908eafd4-9aec-4288-96f1-e8011d181561</RPC_CLIENTID>
            <RPC_CALLID>0</RPC_CALLID>
        </DATA>
    </RECORD>
    <RECORD>
        <OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE>
        <DATA>
            <TXID>131</TXID>
            <BLOCK_ID>1073741839</BLOCK_ID>
        </DATA>
    </RECORD>
    <RECORD>
        <OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
        <DATA>
            <TXID>132</TXID>
            <GENSTAMPV2>1016</GENSTAMPV2>
        </DATA>
    </RECORD>
    <RECORD>
        <OPCODE>OP_ADD_BLOCK</OPCODE>
        <DATA>
            <TXID>133</TXID>
            <PATH>/hello7.txt</PATH>
            <BLOCK>
                <BLOCK_ID>1073741839</BLOCK_ID>
                <NUM_BYTES>0</NUM_BYTES>
                <GENSTAMP>1016</GENSTAMP>
            </BLOCK>
            <RPC_CLIENTID></RPC_CLIENTID>
            <RPC_CALLID>-2</RPC_CALLID>
        </DATA>
    </RECORD>
    <RECORD>
        <OPCODE>OP_CLOSE</OPCODE>
        <DATA>
            <TXID>134</TXID>
            <LENGTH>0</LENGTH>
            <INODEID>0</INODEID>
            <PATH>/hello7.txt</PATH>
            <REPLICATION>2</REPLICATION>
            <MTIME>1512943608761</MTIME>
            <ATIME>1512943607866</ATIME>
            <BLOCKSIZE>134217728</BLOCKSIZE>
            <CLIENT_NAME></CLIENT_NAME>
            <CLIENT_MACHINE></CLIENT_MACHINE>
            <OVERWRITE>false</OVERWRITE>
            <BLOCK>
                <BLOCK_ID>1073741839</BLOCK_ID>
                <NUM_BYTES>25</NUM_BYTES>
                <GENSTAMP>1016</GENSTAMP>
            </BLOCK>
            <PERMISSION_STATUS>
                <USERNAME>admin</USERNAME>
                <GROUPNAME>supergroup</GROUPNAME>
                <MODE>420</MODE>
            </PERMISSION_STATUS>
        </DATA>
    </RECORD>
</EDITS >

三、checkpoint時間設置

(1)通常情況下,SecondaryNameNode每隔一小時執行一次。
[hdfs-default.xml]

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property >

(2)一分鐘檢查一次操作次數,當操作次數達到1百萬時,SecondaryNameNode執行一次。

<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
<description>操作動作次數</description>
</property>

<property>
  <name>dfs.namenode.checkpoint.check.period</name>
  <value>60</value>
<description> 1分鐘檢查一次操作次數</description>
</property >

四、NameNode故障處理

NameNode故障後,可以採用如下兩種方法恢復數據。

方法一:將SecondaryNameNode中數據拷貝到NameNode存儲數據的目錄;

1.kill -9 namenode進程
2.刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

[admin@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

3.拷貝SecondaryNameNode中數據到原NameNode存儲數據目錄

[admin@hadoop102 dfs]$ scp -r admin@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/

4.重新啓動namenode

[admin@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
方法二:使用-importCheckpoint選項啓動NameNode守護進程,從而將SecondaryNameNode中數據拷貝到NameNode目錄中。

1.修改hdfs-site.xml中的

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>120</value>
</property>

<property>
  <name>dfs.namenode.name.dir</name>
  <value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value>
</property>

2.kill -9 namenode進程
3.刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

[admin@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

4.如果SecondaryNameNode不和NameNode在一個主機節點上,需要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件

[admin@hadoop102 dfs]$ scp -r admin@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./

[admin@hadoop102 namesecondary]$ rm -rf in_use.lock

[admin@hadoop102 dfs]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs

[admin@hadoop102 dfs]$ ls
data  name  namesecondary

5.導入檢查點數據(等待一會ctrl+c結束掉)

[admin@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint

6.啓動namenode

[admin@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

五、集羣安全模式

1.概述

  NameNode啓動時,首先將映像文件(fsimage)載入內存,並執行編輯日誌(edits)中的各項操作。一旦在內存中成功建立文件系統元數據的映像,則創建一個新的fsimage文件和一個空的編輯日誌。此時,NameNode開始監聽DataNode請求。但是此刻,NameNode運行在安全模式,即NameNode的文件系統對於客戶端來說是隻讀的。
  系統中的數據塊的位置並不是由NameNode維護的,而是以塊列表的形式存儲在DataNode中。在系統的正常操作期間,NameNode會在內存中保留所有塊位置的映射信息。在安全模式下,各個DataNode會向NameNode發送最新的塊列表信息,NameNode瞭解到足夠多的塊位置信息之後,即可高效運行文件系統。
  如果滿足“最小副本條件”,NameNode會在30秒鐘之後就退出安全模式。所謂的最小副本條件指的是在整個文件系統中99.9%的塊滿足最小副本級別(默認值:dfs.replication.min=1)。在啓動一個剛剛格式化的HDFS集羣時,因爲系統中還沒有任何塊,所以NameNode不會進入安全模式。

2.基本語法

  集羣處於安全模式,不能執行重要操作(寫操作)。集羣啓動完成後,自動退出安全模式。

(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態)

3.舉個栗子

模擬等待安全模式
(1)先進入安全模式

[admin@hadoop102 hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode enter

(2)執行下面的腳本
  編輯一個腳本

#!/bin/bash
bin/hdfs dfsadmin -safemode wait
bin/hdfs dfs -put ~/hello.txt /root/hello.txt

(3)再打開一個窗口,執行

[admin@hadoop102 hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode leave

六、NameNode多目錄配置

1.NameNode的本地目錄可以配置成多個,且每個目錄存放內容相同,增加了可靠性
2.具體配置如下
(1)在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>

(2)停止集羣,刪除data和logs中所有數據。

[admin@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
[admin@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
[admin@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/

(3)格式化集羣並啓動。

[admin@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode –format
[admin@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

(4)查看結果

[admin@hadoop102 dfs]$ ll
總用量 12
drwx------. 3 admin admin 4096 12月 11 08:03 data
drwxrwxr-x. 3 admin admin 4096 12月 11 08:03 name1
drwxrwxr-x. 3 admin admin 4096 12月 11 08:03 name2


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