Hadoop系列009-NameNode工作機(jī)制
本人微信公眾號(hào),歡迎掃碼關(guān)注!

NameNode工作機(jī)制
1 NameNode & SecondaryNameNode工作機(jī)制

1.1 第一階段:namenode啟動(dòng)
1)第一次啟動(dòng)namenode格式化后,創(chuàng)建fsimage和edits文件。如果不是第一次啟動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。
2)客戶端對(duì)元數(shù)據(jù)進(jìn)行增刪改查的請(qǐng)求
3)namenode記錄操作日志,更新滾動(dòng)日志。
4)namenode在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行增刪改查
1.2 第二階段:Secondary NameNode工作
1)Secondary NameNode詢問(wèn)namenode是否需要checkpoint。直接帶回namenode是否檢查結(jié)果。
2)Secondary NameNode請(qǐng)求執(zhí)行checkpoint。
3)namenode滾動(dòng)正在寫(xiě)的edits日志
4)將滾動(dòng)前的編輯日志和鏡像文件拷貝到Secondary NameNode
5)Secondary NameNode加載編輯日志和鏡像文件到內(nèi)存,并合并。
6)生成新的鏡像文件fsimage.chkpoint
7)拷貝fsimage.chkpoint到namenode
8)namenode將fsimage.chkpoint重新命名成fsimage
1.3 參數(shù)設(shè)置
(1)通常情況下,SecondaryNameNode每隔一小時(shí)執(zhí)行一次。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
(2)一分鐘檢查一次操作次數(shù),當(dāng)操作次數(shù)達(dá)到1百萬(wàn)時(shí),SecondaryNameNode執(zhí)行一次。
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作動(dòng)作次數(shù)</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分鐘檢查一次操作次數(shù)</description>
</property>
2 NameNode版本號(hào)
2.1 查看namenode版本號(hào)
在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current這個(gè)目錄下查看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
namenode版本號(hào)具體解釋
(1)namespaceID在HDFS上,會(huì)有多個(gè)Namenode,所以不同Namenode的namespaceID是不同的,分別管理一組blockpoolID。
(2)clusterID集群id,全局唯一
(3)cTime屬性標(biāo)記了namenode存儲(chǔ)系統(tǒng)的創(chuàng)建時(shí)間,對(duì)于剛剛格式化的存儲(chǔ)系統(tǒng),這個(gè)屬性為0;但是在文件系統(tǒng)升級(jí)之后,該值會(huì)更新到新的時(shí)間戳。
(4)storageType屬性說(shuō)明該存儲(chǔ)目錄包含的是namenode的數(shù)據(jù)結(jié)構(gòu)。
(5)blockpoolID:一個(gè)block pool id標(biāo)識(shí)一個(gè)block pool,并且是跨集群的全局唯一。當(dāng)一個(gè)新的Namespace被創(chuàng)建的時(shí)候(format過(guò)程的一部分)會(huì)創(chuàng)建并持久化一個(gè)唯一ID。在創(chuàng)建過(guò)程構(gòu)建全局唯一的BlockPoolID比人為的配置更可靠一些。NN將BlockPoolID持久化到磁盤(pán)中,在后續(xù)的啟動(dòng)過(guò)程中,會(huì)再次load并使用。
(6)layoutVersion是一個(gè)負(fù)整數(shù)。通常只有HDFS增加新特性時(shí)才會(huì)更新這個(gè)版本號(hào)。
3 鏡像文件和編輯日志文件
3.1 概念
3.1.1 Fsimage文件
HDFS文件系統(tǒng)元數(shù)據(jù)的一個(gè)永久性的檢查點(diǎn),其中包含HDFS文件系統(tǒng)的所有目錄和文件idnode的序列化信息。
3.1.2 Edits文件
存放HDFS文件系統(tǒng)的所有更新操作的路徑,文件系統(tǒng)客戶端執(zhí)行的所有寫(xiě)操作首先會(huì)被記錄到edits文件中。
3.1.3 namenode格式化,具體做什么事
(1)創(chuàng)建fsimage文件,存儲(chǔ)fsimage信息
(2)創(chuàng)建edits文件
(3)namenode被格式化之后,將產(chǎn)生如下所示的目錄結(jié)構(gòu)

3.2 oiv查看fsimage文件
(1)查看oiv和oev命令
[atguigu@hadoop102 current]$ hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
(2)基本語(yǔ)法
hdfs oiv -p 文件類型 -i鏡像文件 -o 轉(zhuǎn)換后文件輸出路徑
(3)案例實(shí)操
[atguigu@hadoop102 current]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current
[atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
[atguigu@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/fsimage.xml
將顯示的xml文件內(nèi)容拷貝到eclipse中創(chuàng)建的xml文件中,并格式化。
3.3 oev查看fsimage文件
(1)基本語(yǔ)法
hdfs oev -p 文件類型 -i編輯日志 -o 轉(zhuǎn)換后文件輸出路徑
(2)案例實(shí)操
[atguigu@hadoop102 current]$ hdfs oev -p XML -i
edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
[atguigu@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/edits.xml
將顯示的xml文件內(nèi)容拷貝到eclipse中創(chuàng)建的xml文件中,并格式化。
4 滾動(dòng)編輯日志
正常情況HDFS文件系統(tǒng)有更新操作時(shí),就會(huì)滾動(dòng)編輯日志。也可以用命令強(qiáng)制滾動(dòng)編輯日志。
1)滾動(dòng)編輯日志(前提必須啟動(dòng)集群)
hdfs dfsadmin -rollEdits
2)鏡像文件什么時(shí)候產(chǎn)生
Namenode啟動(dòng)時(shí)加載鏡像文件和編輯日志

5 SecondaryNameNode目錄結(jié)構(gòu)
Secondary NameNode用來(lái)監(jiān)控HDFS狀態(tài)的輔助后臺(tái)程序,每隔一段時(shí)間獲取HDFS元數(shù)據(jù)的快照。
在/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/current這個(gè)目錄中查看SecondaryNameNode目錄結(jié)構(gòu)。
SecondaryNameNode在previous.checkpoint子目錄中備份了主namenode節(jié)點(diǎn)中的數(shù)據(jù)

SecondaryNameNode的previous.checkpoint目錄、SecondaryNameNode的current目錄和主namenode的current目錄的布局相同。
好處:在主namenode發(fā)生故障時(shí)(假設(shè)沒(méi)有及時(shí)備份數(shù)據(jù)),可以從SecondaryNameNode恢復(fù)數(shù)據(jù)。
方法一:將相關(guān)存儲(chǔ)目錄復(fù)制到新的namenode中;
方法二:使用-importCheckpoint選項(xiàng)啟動(dòng)namenode守護(hù)進(jìn)程,從而將SecondaryNameNode用作新的主namenode。
6 集群安全模式操作
6.2 概述
Namenode啟動(dòng)時(shí),首先將映像文件(fsimage)載入內(nèi)存,并執(zhí)行編輯日志(edits)中的各項(xiàng)操作。一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)的映像,則創(chuàng)建一個(gè)新的fsimage文件和一個(gè)空的編輯日志。此時(shí),namenode開(kāi)始監(jiān)聽(tīng)datanode請(qǐng)求。但是此刻,namenode運(yùn)行在安全模式,即namenode的文件系統(tǒng)對(duì)于客戶端來(lái)說(shuō)是只讀的。
系統(tǒng)中的數(shù)據(jù)塊的位置并不是由namenode維護(hù)的,而是以塊列表的形式存儲(chǔ)在datanode中。在系統(tǒng)的正常操作期間,namenode會(huì)在內(nèi)存中保留所有塊位置的映射信息。在安全模式下,各個(gè)datanode會(huì)向namenode發(fā)送最新的塊列表信息,namenode了解到足夠多的塊位置信息之后,即可高效運(yùn)行文件系統(tǒng)。
如果滿足“最小復(fù)本條件”,namenode會(huì)在30秒鐘之后就退出安全模式。所謂的最小復(fù)本條件指的是在整個(gè)文件系統(tǒng)中99.9%的塊滿足最小復(fù)本級(jí)別(默認(rèn)值:dfs.replication.min=1)。在啟動(dòng)一個(gè)剛剛格式化的HDFS集群時(shí),因?yàn)橄到y(tǒng)中還沒(méi)有任何塊,所以namenode不會(huì)進(jìn)入安全模式。
6.3 基本語(yǔ)法
集群處于安全模式,不能執(zhí)行重要操作(寫(xiě)操作)。集群?jiǎn)?dòng)完成后,自動(dòng)退出安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態(tài))
(2)bin/hdfs dfsadmin -safemode enter (功能描述:進(jìn)入安全模式狀態(tài))
(3)bin/hdfs dfsadmin -safemode leave (功能描述:離開(kāi)安全模式狀態(tài))
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態(tài))
6.3 案例
編輯一個(gè)腳本
#!/bin/bash
bin/hdfs dfsadmin -safemode wait
bin/hdfs dfs –put ~/hello.txt /root/hello.txt

浙公網(wǎng)安備 33010602011771號(hào)