一 NameNode和SecondaryNameNode
1??
NN和2NN工作機制思考:
NameNode中的元數(shù)據(jù)是存儲在哪里的?
??首先,我們做個假設,如果存儲在NameNode節(jié)點的磁盤中,因為經(jīng)常需要進行隨機訪問,還有響應客戶請求,必然是效率過低。因此,元數(shù)據(jù)需要存放在內(nèi)存中。但如果只存在內(nèi)存中,一旦斷電,元數(shù)據(jù)丟失,整個集群就無法工作了。因此產(chǎn)生在磁盤中備份元數(shù)據(jù)的FsImage。
??這樣又會帶來新的問題,當在內(nèi)存中的元數(shù)據(jù)更新時,如果同時更新FsImage,就會導致效率過低,但如果不更新,就會發(fā)生一致性問題,一旦NameNode節(jié)點斷電,就會產(chǎn)生數(shù)據(jù)丟失。因此,引入Edits文件(只進行追加操作,效率很高)。每當元數(shù)據(jù)有更新或者添加元數(shù)據(jù)時,修改內(nèi)存中的元數(shù)據(jù)并追加到Edits中。這樣,一旦NameNode節(jié)點斷電,可以通過FsImage和Edits的合并,合成元數(shù)據(jù)。
??但是,如果長時間添加數(shù)據(jù)到Edits中,會導致該文件數(shù)據(jù)過大,效率降低,而且一旦斷電,恢復元數(shù)據(jù)需要的時間過長。因此,需要定期進行FsImage和Edits的合并,如果這個操作由NameNode節(jié)點完成,又會效率過低。因此,引入一個新的節(jié)點SecondaryNamenode,專門用于FsImage和Edits的合并。1. 第一階段:NameNode啟動
?(1)第一次啟動NameNode格式化后,創(chuàng)建Fsimage和Edits文件。如果不是第一次啟動,直接加載編輯日志和鏡像文件到內(nèi)存。
?(2)客戶端對元數(shù)據(jù)進行增刪改的請求。
?(3)NameNode記錄操作日志,更新滾動日志。
?(4)NameNode在內(nèi)存中對元數(shù)據(jù)進行增刪改。
- 第二階段:
Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要CheckPoint。直接帶回NameNode是否檢查結(jié)果。
(2)Secondary NameNode請求執(zhí)行CheckPoint。
(3)NameNode滾動正在寫的Edits日志。
(4)將滾動前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內(nèi)存,并合并。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。2??
NN和2NN工作機制詳解3??
Fsimage和Edits解析
?1. 概念?2.oiv查看Fsimage命令
?(1)查看oiv和oev命令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 轉(zhuǎn)換后文件輸出路徑
?(3)案例實操hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml cat /opt/module/hadoop-2.7.2/fsimage.xml??將顯示的
xml文件內(nèi)容打開部分顯示結(jié)果如下<inode> <id>16386</id> <type>DIRECTORY</type> <name>user</name> <mtime>1512722284477</mtime> <permission>xxx:supergroup:rwxr-xr-x</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16387</id> <type>DIRECTORY</type> <name>xxx</name> <mtime>1512790549080</mtime> <permission>xxx: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>xxx:supergroup:rw-r--r--</permission> <blocks> <block> <id>1073741825</id> <genstamp>1001</genstamp> <numBytes>59</numBytes> </block> </blocks> </inode >??
思考:可以看出,F(xiàn)simage中沒有記錄塊所對應DataNode,為什么?
??在集群啟動后,要求DataNode上報數(shù)據(jù)塊信息,并間隔一段時間后再次上報。
?3.oev查看Edits文件
?(1)基本語法hdfs oev -p 文件類型 -i編輯日志 -o 轉(zhuǎn)換后文件輸出路徑?(2)案例實操
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml?將顯示的
xml文件內(nèi)容打開部分顯示結(jié)果如下<?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>xxx</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>xxx</USERNAME> <GROUPNAME>supergroup</GROUPNAME> <MODE>420</MODE> </PERMISSION_STATUS> </DATA> </RECORD> </EDITS >?
思考:NameNode如何確定下次開機啟動的時候合并哪些Edits?4??
CheckPoint時間設置
(1)通常情況下,SecondaryNameNode每隔一小時執(zhí)行一次。<property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> </property>(2)一分鐘檢查一次操作次數(shù),當操作次數(shù)達到1百萬時,
SecondaryNameNode執(zhí)行一次.<property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <description>操作動作次數(shù)</description> </property> <property> <name>dfs.namenode.checkpoint.check.period</name> <value>60</value> <description> 1分鐘檢查一次操作次數(shù)</description> </property >5??
NameNode故障處理
?NameNode故障后,可以采用如下兩種方法恢復數(shù)據(jù)。
(1)將SecondaryNameNode中數(shù)據(jù)拷貝到NameNode存儲數(shù)據(jù)的目錄;
kill -9 NameNode進程- 刪除
NameNode存儲的數(shù)據(jù)(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
- 拷貝
SecondaryNameNode中數(shù)據(jù)到原NameNode存儲數(shù)據(jù)目錄scp -r xxx@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
- 重新啟動
NameNodesbin/hadoop-daemon.sh start namenode(2)使用
-importCheckpoint選項啟動NameNode守護進程,從而將SecondaryNameNode中數(shù)據(jù)拷貝到NameNode目錄中。
- 修改
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>
kill -9 NameNode進程- 刪除
NameNode存儲的數(shù)據(jù)(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
- 如果
SecondaryNameNode不和NameNode在一個主機節(jié)點上,需要將SecondaryNameNode存儲數(shù)據(jù)的目錄拷貝到NameNode存儲數(shù)據(jù)的平級目錄,并刪除in_use.lock文件scp -r xxx@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./ rm -rf in_use.lock
- 導入檢查點數(shù)據(jù)(等待一會
ctrl+c結(jié)束掉)bin/hdfs namenode -importCheckpoint
- 啟動
NameNodesbin/hadoop-daemon.sh start namenode6??集群安全模式
?1. 概述
?2. 基本語法 : 集群處于安全模式,不能執(zhí)行重要操作(寫操作)。集群啟動完成后,自動退出安全模式。(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態(tài)) (2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態(tài)) (3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態(tài)) (4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態(tài))
二 DataNode工作機制
?1)一個數(shù)據(jù)塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個是數(shù)據(jù)本身,一個是元數(shù)據(jù)包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗和,以及時間戳。
?2)DataNode啟動后向NameNode注冊,通過后,周期性(1小時)的向NameNode上報所有的塊信息。
?3)心跳是每3秒一次,心跳返回結(jié)果帶有NameNode給該DataNode的命令如復制塊數(shù)據(jù)到另一臺機器,或刪除某個數(shù)據(jù)塊。如果超過10分鐘沒有收到某個DataNode的心跳,則認為該節(jié)點不可用。
?4)集群運行中可以安全加入和退出一些機器。1??數(shù)據(jù)完整性
?思考:如果電腦磁盤里面存儲的數(shù)據(jù)是控制高鐵信號燈的紅燈信號(1)和綠燈信號(0),但是存儲該數(shù)據(jù)的磁盤壞了,一直顯示是綠燈,是否很危險?同理DataNode節(jié)點上的數(shù)據(jù)損壞了,卻沒有發(fā)現(xiàn),是否也很危險,那么如何解決呢?
?如下是DataNode節(jié)點保證數(shù)據(jù)完整性的方法。
?1)當DataNode讀取Block的時候,它會計算CheckSum。
?2)如果計算后的CheckSum,與Block創(chuàng)建時值不一樣,說明Block已經(jīng)損壞。
?3)Client讀取其他DataNode上的Block。
?4)DataNode在其文件創(chuàng)建后周期驗證CheckSum,如下圖所示
2??掉線時限參數(shù)設置
?需要注意的是hdfs-site.xml配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。<property> <name>dfs.namenode.heartbeat.recheck-interval</name> <value>300000</value> </property> <property> <name>dfs.heartbeat.interval</name> <value>3</value> </property>3??服役新數(shù)據(jù)節(jié)點
?隨著公司業(yè)務的增長,數(shù)據(jù)量越來越大,原有的數(shù)據(jù)節(jié)點的容量已經(jīng)不能滿足存儲數(shù)據(jù)的需求,需要在原有集群基礎上動態(tài)添加新的數(shù)據(jù)節(jié)點。
- 環(huán)境準備
(1)在hadoop104主機上再克隆一臺hadoop105主機
(2)修改IP地址和主機名稱
(3)刪除原來HDFS文件系統(tǒng)留存的文件(/opt/module/hadoop-2.7.2/data和log)
(4)source一下配置文件source /etc/profile
- 服役新節(jié)點具體步驟
(1)直接啟動DataNode,即可關(guān)聯(lián)到集群sbin/hadoop-daemon.sh start datanode sbin/yarn-daemon.sh start nodemanager(2)在hadoop105上上傳文件hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /(3)如果數(shù)據(jù)不均衡,可以用命令實現(xiàn)集群的再平衡
./start-balancer.sh4??退役舊數(shù)據(jù)節(jié)點
?1添加白名單: 添加到白名單的主機節(jié)點,都允許訪問NameNode,不在白名單的主機節(jié)點,都會被退出.(1)在
NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下創(chuàng)建dfs.hosts文件
(2)添加對應的主機名,案例使用的是如下主機名hadoop102 hadoop103 hadoop104(3)在
NameNode的hdfs-site.xml配置文件中增加dfs.hosts屬性<property> <name>dfs.hosts</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value> </property>(4)配置文件分發(fā)
xsync hdfs-site.xml(5)刷新
NameNodehdfs dfsadmin -refreshNodes(6)更新
ResourceManager節(jié)點yarn rmadmin -refreshNodes(7)在
web瀏覽器上查看(8)如果數(shù)據(jù)不均衡,可以用命令實現(xiàn)集群的再平衡./start-balancer.sh?2.
黑名單退役: 在黑名單上面的主機都會被強制退出。(1)在
NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下創(chuàng)建dfs.hosts.exclude文件
(2)添加對應的主機名,案例使用的是如下主機名 :hadoop105
(3)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude屬性<property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value> </property>(4)刷新
NameNode、刷新ResourceManagerhdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes(5)檢查
Web瀏覽器,退役節(jié)點的狀態(tài)為decommission in progress(退役中),說明數(shù)據(jù)節(jié)點正在復制塊到其他節(jié)點(6)等待退役節(jié)點狀態(tài)為decommissioned(所有塊已經(jīng)復制完成),停止該節(jié)點及節(jié)點資源管理器。注意:如果副本數(shù)是3,服役的節(jié)點小于等于3,是不能退役成功的,需要修改副本數(shù)后才能退役sbin/hadoop-daemon.sh stop datanode sbin/yarn-daemon.sh stop nodemanager(7)如果數(shù)據(jù)不均衡,可以用命令實現(xiàn)集群的再平衡
sbin/start-balancer.sh
注意:不允許白名單和黑名單中同時出現(xiàn)同一個主機名稱。5??
Datanode多目錄配置
?1.DataNode也可以配置成多個目錄,每個目錄存儲的數(shù)據(jù)不一樣。即:數(shù)據(jù)不是副本
?2.具體配置如下(修改hdfs-site.xml文件)<property> <name>dfs.datanode.data.dir</name> <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value> </property>










