1. 第一階段:namenode 啓動
(1) 第一次啓動 namenode 格式化後,建立 fsimage 和 edits 文件。若是不是第一次啓動,直接加載編輯日誌和鏡像文件到內存;
(2) 客戶端對元數據進行增刪改的請求;
(3) namenode 記錄操做日誌,更新滾動日誌;
(4) namenode 在內存中對數據進行增刪改查。html
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。node
3. web 端訪問 SecondaryNameNode
(1) 啓動集羣
(2) 瀏覽器中輸入:http://hadoop102:50090/status.html
(3) 查看 SecondaryNameNode 信息web
4. chkpoint 檢查時間參數設置
(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>
1. 概念
namenode 被格式化以後,將在 /opt/module/hadoop-2.7.2/data/tmp/dfs/name/current 目錄中產生以下文件bash
edits_0000000000000000000 fsimage_0000000000000000000.md5 seen_txid VERSION
(1) Fsimage 文件:HDFS 文件系統元數據的一個永久性的檢查點,其中包含 HDFS 文件系統的全部目錄和文件 idnode 的序列化信息;
(2) Edits 文件:存放 HDFS 文件系統的全部更新操做的路徑,文件系統客戶端執行的全部寫操做首先會被記錄到 edits 文件中;
(3) seen_txid 文件:保存的是一個數字,就是最後一個 edits_ 的數字;
(4) 每次 Namenode 啓動的時候都會將 fsimage 文件讀入內存,並從 00001 開始到 seen_txid 中記錄的數字依次執行每一個 edits 裏面的更新操做,保證內存中的元數據信息是最新的、同步的,能夠當作 Namenode 啓動的時候就將 fsimage 和 edits 文件進行了合併。數據結構
2. oiv 查看 fsimage 文件
(1) 查看 oiv 和 oev 命令app
[bigdata@hadoop102 current]$ hdfs oiv apply the offline fsimage viewer to an fsimage oev apply the offline edits viewer to an edits file
(2) 基本語法eclipse
hdfs oiv -p 文件類型 -i鏡像文件 -o 轉換後文件輸出路徑
(3) 案例實操oop
[bigdata@hadoop102 current]$ pwd /opt/module/hadoop-2.7.2/data/tmp/dfs/name/current [bigdata@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml [bigdata@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/fsimage.xml
將顯示的 xml 文件內容拷貝到 eclipse 中建立的 xml 文件中,並格式化後查看。
3. oev 查看 edits 文件
(1) 基本語法
hdfs oev -p 文件類型 -i編輯日誌 -o 轉換後文件輸出路徑
(2) 案例實操
[bigdata@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml [bigdata@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/edits.xml
將顯示的 xml 文件內容拷貝到 eclipse 中建立的 xml 文件中,並格式化後查看。
正常狀況 HDFS 文件系統有更新操做時,就會滾動編輯日誌。也能夠用命令強制滾動編輯日誌。
(1) 滾動編輯日誌(前提必須啓動集羣)
[bigdata@hadoop102 current]$ hdfs dfsadmin -rollEdits
(2) 鏡像文件何時產生
Namenode 啓動時加載鏡像文件和編輯日誌
1. 查看 namenode 版本號
在 /opt/module/hadoop-2.7.2/data/tmp/dfs/name/current 這個目錄下查看 VERSION
namespaceID=1933630176 clusterID=CID-1f2bf8d1-5ad2-4202-af1c-6713ab381175 cTime=0 storageType=NAME_NODE blockpoolID=BP-97847618-192.168.10.102-1493726072779 layoutVersion=-63
2. namenode 版本號具體解釋
(1) namespaceID 在 HDFS 上,會有多個 Namenode,因此不一樣 Namenode 的 namespaceID 是不一樣的,分別管理一組 blockpoolID;
(2) clusterID 集羣 id,全局惟一;
(3) cTime 屬性標記了 namenode 存儲系統的建立時間,對於剛剛格式化的存儲系統,這個屬性爲 0;可是在文件系統升級以後,該值會更新到新的時間戳;
(4) storageType 屬性說明該存儲目錄包含的是 namenode 的數據結構;
(5) blockpoolID:一個 block pool id 標識一個 block pool,而且是跨集羣的全局惟一。當一個新的 Namespace 被建立的時候( format 過程的一部分)會建立並持久化一個惟一 ID。在建立過程構建全局惟一的 BlockPoolID 比人爲的配置更可靠一些。NN 將 BlockPoolID 持久化到磁盤中,在後續的啓動過程當中,會再次 load 並使用;
(6) layoutVersion 是一個負整數。一般只有 HDFS 增長新特性時纔會更新這個版本號。
Secondary NameNode 用來監控 HDFS 狀態的輔助後臺程序,每隔一段時間獲取 HDFS 元數據的快照。
在 /opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/current 這個目錄中查看 SecondaryNameNode 目錄結構。
edits_0000000000000000001-0000000000000000002 fsimage_0000000000000000002 fsimage_0000000000000000002.md5 VERSION
SecondaryNameNode的namesecondary/current 目錄和主 namenode 的 current 目錄的佈局相同。
好處:在主 namenode 發生故障時 (假設沒有及時備份數據),能夠從 SecondaryNameNode 恢復數據。
方法一:將 SecondaryNameNode 中數據拷貝到 namenode 存儲數據的目錄;
方法二:使用 -importCheckpoint 選項啓動 namenode 守護進程,從而將 SecondaryNameNode 用做新的主 namenode。
1. 案例實操(一):
模擬 namenode 故障,並採用方法一,恢復 namenode 數據
(1) kill -9 namenode 進程;
(2) 刪除 namenode 存儲的數據 (/opt/module/hadoop-2.7.2/data/tmp/dfs/name);
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
(3) 拷貝 SecondaryNameNode 中數據到原 namenode 存儲數據目錄;
cp -R /opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* /opt/module/hadoop-2.7.2/data/tmp/dfs/name/
(4) 從新啓動 namenode;
sbin/hadoop-daemon.sh start namenode
2. 案例實操(二):
模擬 namenode 故障,並採用方法二,恢復 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);
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
(4) 若是 SecondaryNameNode 不和 Namenode 在一個主機節點上,須要將 SecondaryNameNode 存儲數據的目錄拷貝到 Namenode 存儲數據的平級目錄;
[bigdata@hadoop102 dfs]$ pwd /opt/module/hadoop-2.7.2/data/tmp/dfs [bigdata@hadoop102 dfs]$ ls data name namesecondary
(5) 導入檢查點數據 (等待一會 ctrl+c 結束掉);
bin/hdfs namenode -importCheckpoint
(6) 啓動 namenode;
sbin/hadoop-daemon.sh start namenode
(7) 若是提示文件鎖了,能夠刪除 in_use.lock。
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/in_use.lock
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) 先進入安全模式;
bin/hdfs dfsadmin -safemode enter
(2) 執行下面的腳本;
#!/bin/bash bin/hdfs dfsadmin -safemode wait bin/hdfs dfs -put ~/hello.txt /root/hello.txt
(3) 再打開一個窗口,執行。
bin/hdfs dfsadmin -safemode leave
(1) namenode 的本地目錄能夠配置成多個,且每一個目錄存放內容相同,增長了可靠性;
(2) 具體配置以下: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>