接上篇,上篇文章傳送門:HDFS(上):HDFS優缺點、HDFS操作、HDFS用戶端操作、HDFS的API、HDFS資料流、HDFS的IO流、HDFS讀寫資料流程、HDFS檔案處理詳解、windows安裝hadoop
文章目錄
第5章·NameNode和SecondaryNameNode(面試開發重點)
5.1NN和2NN工作機制
5.2·Fsimage和Edits 解析。
5.3·CheckPoint時間設定
5.4-NameNode 故障處理
5.5·叢集安全模式
第6章·DataNode(面試開發重點)
6.1 DataNode 工作機制
6.2·資料完整性
6.3·掉線時限參數設定
6.4·服役新資料節點
6.5·退役舊資料節點
6.5.1·添加自名單。
6.5.2·黑名單退役
6.6-Datanode多目錄配置。
第7章·HDFS2.X新特性
7.1·叢集間資料拷貝
7.2·小檔案存檔
第5章 NameNode和SecondaryNameNode(面試開發重點)
5.1 NN和2NN工作機制
思考:NameNode中的中繼資料是存儲在哪裡的?
首先,我們做個假設,如果存儲在NameNode節點的磁盤中,因為經常需要進行随機通路,還有響應客戶請求,必然是效率過低。是以,中繼資料需要存放在記憶體中。但如果隻存在記憶體中,一旦斷電,中繼資料丢失,整個叢集就無法工作了。是以産生在磁盤中備份中繼資料的FsImage。
這樣又會帶來新的問題,當在記憶體中的中繼資料更新時,如果同時更新FsImage,就會導緻效率過低,但如果不更新,就會發生一緻性問題,一旦NameNode節點斷電,就會産生資料丢失。是以,引入Edits檔案(隻進行追加操作,效率很高)。每當中繼資料有更新或者添加中繼資料時,修改記憶體中的中繼資料并追加到Edits中。這樣,一旦NameNode節點斷電,可以通過FsImage和Edits的合并,合成中繼資料。
但是,如果長時間添加資料到Edits中,會導緻該檔案資料過大,效率降低,而且一旦斷電,恢複中繼資料需要的時間過長。是以,需要定期進行FsImage和Edits的合并,如果這個操作由NameNode節點完成,又會效率過低。是以,引入一個新的節點SecondaryNamenode,專門用于FsImage和Edits的合并。
NN和2NN工作機制,如圖3-14所示。
圖3-14 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中。
5.2 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檔案系統的所有目錄和檔案inode的序列化資訊。
(2)Edits檔案:存放HDFS檔案系統的所有更新操作的路徑,檔案系統用戶端執行的所有寫操作首先會被記錄到Edits檔案中。
(3)seen_txid檔案儲存的是一個數字,就是最後一個edits_的數字(4)每次NameNode啟動的時候都會将Fsimage檔案讀入記憶體,加載Edits裡面的更新操作,保證記憶體中的中繼資料資訊是最新的、同步的,可以看成NameNode啟動的時候就将Fsimage和Edits檔案進行了合并。
2.oiv檢視Fsimage檔案
(1)檢視oiv和oev指令
[[email protected] 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)案例實操
[[email protected] current]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current
[[email protected] current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
[atgui[email protected] 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>atguigu:supergroup:rwxr-xr-x</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16387</id>
<type>DIRECTORY</type>
<name>atguigu</name>
<mtime>1512790549080</mtime>
<permission>atguigu: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>atguigu:supergroup:rw-r--r--</permission>
<blocks>
<block>
<id>1073741825</id>
<genstamp>1001</genstamp>
<numBytes>59</numBytes>
</block>
</blocks>
</inode >
思考:可以看出,Fsimage中沒有記錄塊所對應DataNode,為什麼?
在叢集啟動後,要求DataNode上報資料塊資訊,并間隔一段時間後再次上報。
3.oev檢視Edits檔案
(1)基本文法
hdfs oev -p 檔案類型 -i編輯日志 -o 轉換後檔案輸出路徑
(2)案例實操
[[email protected] current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
[atg[email protected] 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>atguigu</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>atguigu</USERNAME>
<GROUPNAME>supergroup</GROUPNAME>
<MODE>420</MODE>
</PERMISSION_STATUS>
</DATA>
</RECORD>
</EDITS >
思考:NameNode如何确定下次開機啟動的時候合并哪些Edits?
5.3 CheckPoint時間設定
(1)通常情況下,SecondaryNameNode每隔一小時執行一次。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
(2)一分鐘檢查一次操作次數,3當操作次數達到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 >
5.4 NameNode故障處理
NameNode故障後,可以采用如下兩種方法恢複資料。
方法一:将SecondaryNameNode中資料拷貝到NameNode存儲資料的目錄;
1.kill -9 NameNode程序
2.删除NameNode存儲的資料(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
[[email protected] hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
3.拷貝SecondaryNameNode中資料到原NameNode存儲資料目錄
[[email protected] dfs]$ scp -r [email protected]:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
4.重新啟動NameNode
[atguig[email protected] 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)
[[email protected] hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
4.如果SecondaryNameNode不和NameNode在一個主機節點上,需要将SecondaryNameNode存儲資料的目錄拷貝到NameNode存儲資料的平級目錄,并删除in_use.lock檔案
[[email protected] dfs]$ scp -r [email protected]:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./
[[email protected] namesecondary]$ rm -rf in_use.lock
[[email protected] dfs]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs
[[email protected] dfs]$ ls
data name namesecondary
5.導入檢查點資料(等待一會ctrl+c結束掉)
[atgui[email protected] hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint
6.啟動NameNode
[atguig[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
5.5 叢集安全模式
1.概述
1、NameNode啟動
NameNode啟動時,首先将鏡像檔案(Fsimage)載入記憶體,并執行編輯日志(Edits)中的各項操作。一旦在記憶體中成功建立檔案系統中繼資料的映像,則建立一個新的Fsimage檔案和一個空的編輯日志。此時,NameNode開始監聽DataNode請求。這個過程期間,NameNode一直運作在安全模式,即NameNode的檔案系統對于用戶端來說是隻讀的。
2、Data Node啟動
系統中的資料塊的位置并不是由NameNode維護的,而是以塊清單的開形式存儲在DataNode中。在系統的正常操作期間,NameNode會在記憶體中保留所有塊位置的映射資訊。在安全模式下,各個DataNode會向NameNode發送最新的塊清單資訊,NameNode了解到足夠多的塊位置資訊之後,即可高效運作檔案系統。
3、安全模式退出判斷
如果滿足“最小副本條件”,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)檢視目前模式
[[email protected] hadoop-2.7.2]$ hdfs dfsadmin -safemode get
Safe mode is OFF
(2)先進入安全模式
[atg[email protected] hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode enter
(3)建立并執行下面的腳本
在/opt/module/hadoop-2.7.2路徑上,編輯一個腳本safemode.sh
[[email protected] hadoop-2.7.2]$ touch safemode.sh
[[email protected] hadoop-2.7.2]$ vim safemode.sh
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-2.7.2/README.txt /
[[email protected] hadoop-2.7.2]$ chmod 777 safemode.sh
[[email protected] hadoop-2.7.2]$ ./safemode.sh
(4)再打開一個視窗,執行
[atg[email protected] hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode leave
(5)觀察
(a)再觀察上一個視窗
Safe mode is OFF
(b)HDFS叢集上已經有上傳的資料了。
第6章 DataNode(面試開發重點)
6.1 DataNode工作機制
DataNode工作機制,如圖3-15所示。
圖3-15 DataNode工作機制
1)一個資料塊在DataNode上以檔案形式存儲在磁盤上,包括兩個檔案,一個是資料本身,一個是中繼資料包括資料塊的長度,塊資料的校驗和,以及時間戳。
2)DataNode啟動後向NameNode注冊,通過後,周期性(1小時)的向NameNode上報所有的塊資訊。
3)心跳是每3秒一次,心跳傳回結果帶有NameNode給該DataNode的指令如複制塊資料到另一台機器,或删除某個資料塊。如果超過10分鐘沒有收到某個DataNode的心跳,則認為該節點不可用。
4)叢集運作中可以安全加入和退出一些機器。
6.2 資料完整性
思考:如果電腦磁盤裡面存儲的資料是控制高鐵信号燈的紅燈信号(1)和綠燈信号(0),但是存儲該資料的磁盤壞了,一直顯示是綠燈,是否很危險?同理DataNode節點上的資料損壞了,卻沒有發現,是否也很危險,那麼如何解決呢?
如下是DataNode節點保證資料完整性的方法。
1)當DataNode讀取Block的時候,它會計算CheckSum。
2)如果計算後的CheckSum,與Block建立時值不一樣,說明Block已經損壞。
3)Client讀取其他DataNode上的Block。
4)DataNode在其檔案建立後周期驗證CheckSum,如圖3-16所示。
6.3 掉線時限參數設定
1、DatalNode程序死亡或者網絡故障造成DataNode無法與NameNode通信
2、NameNode不會立即把該節點判定為死亡,要經過一段時間,這段時間暫稱作逾時時長。
3、HDFS預設的逾時時長為10分鐘+30秒。
4、如果定義逾時時間為TimeOut,則逾時時長的計算公式為:
TimeOut =2*dfs.namenode heartbeat.recheck-interval +10*dfs.heartbeatinterval。
而預設的dfs.namenode.heartbeat.recheck-interval大小為5分鐘,dfs.heartbeatinterval預設為3秒。
需要注意的是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>
6.4 服役新資料節點
0.需求
随着公司業務的增長,資料量越來越大,原有的資料節點的容量已經不能滿足存儲資料的需求,需要在原有叢集基礎上動态添加新的資料節點。
1.環境準備
(1)在hadoop104主機上再克隆一台hadoop105主機
(2)修改IP位址和主機名稱
必要的操作:
[[email protected] 桌面]# vi /etc/udev/rules.d/70-persistent-net.rules
[[email protected] 桌面]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
[[email protected] 桌面]# vi /etc/sysconfig/network
[[email protected] 桌面]# sync
[[email protected] 桌面]# reboot
[[email protected] module]$ rsync -av hadoop-2.7.2/ hadoop105:/opt/module/
(3)删除原來HDFS檔案系統留存的檔案(/opt/module/hadoop-2.7.2/data和log)
[[email protected] hadoop-2.7.2]# rm -rf data/ logs/
(4)source一下配置檔案
[[email protected] hadoop-2.7.2]$ source /etc/profile
2.服役新節點具體步驟
(1)直接啟動DataNode,即可關聯到叢集
[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[[email protected] hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
[[email protected] hadoop-2.7.2]$ jps
4673 NodeManager
4523 DataNode
4796 Jps
踩過的坑:未關閉防火牆導緻無法檢視新的節點
解決方法:用sudo service iptables status指令檢查防火牆關閉情況,如果沒關,臨時關閉(service iptables stop)試試,要永久關閉
(2)在hadoop105上上傳檔案
[[email protected] hadoop-2.7.2]$ hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /
(3)如果資料不均衡,可以用指令實作叢集的再平衡
[[email protected] sbin]$ ./start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
6.5 退役舊資料節點
6.5.1 添加白名單
添加到白名單的主機節點,都允許通路NameNode,不在白名單的主機節點,都會被退出。
配置白名單的具體步驟如下:
(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下建立dfs.hosts檔案
[[email protected] hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[[email protected] hadoop]$ touch dfs.hosts
[[email protected] hadoop]$ vi dfs.hosts
添加如下主機名稱(不添加hadoop105)
hadoop102
hadoop103
hadoop104
(2)在NameNode的hdfs-site.xml配置檔案中增加dfs.hosts屬性
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
(3)配置檔案分發
[[email protected] hadoop]$ xsync hdfs-site.xml
(4)重新整理NameNode
[[email protected] hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
(5)更新ResourceManager節點
[[email protected] hadoop-2.7.2]$ yarn rmadmin -refreshNodes
17/06/24 14:17:11 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
(6)在web浏覽器上檢視
4.如果資料不均衡,可以用指令實作叢集的再平衡
[[email protected] sbin]$ ./start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
6.5.2 黑名單退役
在黑名單上面的主機都會被強制退出。
1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下建立dfs.hosts.exclude檔案
[[email protected] hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[[email protected] hadoop]$ touch dfs.hosts.exclude
[[email protected] hadoop]$ vi dfs.hosts.exclude
添加如下主機名稱(要退役的節點)
hadoop105
2.在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>
3.重新整理NameNode、重新整理ResourceManager
[[email protected] hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
[[email protected] hadoop-2.7.2]$ yarn rmadmin -refreshNodes
17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
4.檢查Web浏覽器,退役節點的狀态為decommission in progress(退役中),說明資料節點正在複制塊到其他節點,如圖3-17所示
圖3-17 退役中
5.等待退役節點狀态為decommissioned(所有塊已經複制完成),停止該節點及節點資料總管。注意:如果副本數是3,服役的節點小于等于3,是不能退役成功的,需要修改副本數後才能退役,如圖3-18所示
圖3-18 已退役
[[email protected] hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[[email protected] hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
6.如果資料不均衡,可以用指令實作叢集的再平衡
[[email protected] hadoop-2.7.2]$ sbin/start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
注意:不允許白名單和黑名單中同時出現同一個主機名稱。
6.6 Datanode多目錄配置
1.DataNode也可以配置成多個目錄,每個目錄存儲的資料不一樣。即:資料不是副本
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>
最後分發同步
[[email protected] etc]$ xsync hadoop/
第7章 HDFS 2.X新特性
7.1 叢集間資料拷貝
1.scp實作兩個遠端主機之間的檔案複制
scp -r hello.txt [email protected]:/user/atguigu/hello.txt // 推 push
scp -r [email protected]:/user/atguigu/hello.txt hello.txt // 拉 pull
scp -r [email protected]:/user/atguigu/hello.txt [email protected]:/user/atguigu //是通過本地主機中轉實作兩個遠端主機的檔案複制;如果在兩個遠端主機之間ssh沒有配置的情況下可以使用該方式。
2.采用distcp指令實作兩個Hadoop叢集之間的遞歸資料複制
[[email protected] hadoop-2.7.2]$ bin/hadoop distcp
hdfs://haoop102:9000/user/atguigu/hello.txt hdfs://hadoop103:9000/user/atguigu/hello.txt
7.2 小檔案存檔
1、HDFS存儲小檔案弊端
每個檔案均按塊存儲,每個塊的中繼資料存儲在NameNode的記憶體中,是以HDFS存儲小檔案會非常低效。因為大量的小檔案會耗盡NameNode中的大部分記憶體。但注意,存儲小檔案所需要的磁盤容量和資料塊的大小無關。例如,一個1MB的檔案設定為128MB的塊存儲,實際使用的是1MB的磁盤空間,而不是128MB。
2、解決存儲小檔案辦法之一
HDFS存檔檔案或HAR檔案,是一個更高效的檔案存檔工具,它将檔案存入HDFS塊,在減少NameNode記憶體使用的同時,允許對檔案進行透明的通路。具體說來,HDFS存檔檔案對内還是一個一個獨立檔案,對NameNode而言卻是一個整體,減少了NameNode]記憶體。
3.案例實操
(1)需要啟動YARN程序
[[email protected] hadoop-2.7.2]$ start-yarn.sh
(2)歸檔檔案
把/user/atguigu/input目錄裡面的所有檔案歸檔成一個叫input.har的歸檔檔案,并把歸檔後檔案存儲到/user/atguigu/output路徑下。
[[email protected] hadoop-2.7.2]$ bin/hadoop archive -archiveName input.har –p /user/atguigu/input /user/atguigu/output
(3)檢視歸檔
[[email protected] hadoop-2.7.2]$ hadoop fs -lsr /user/atguigu/output/input.har
[[email protected] hadoop-2.7.2]$ hadoop fs -lsr har:///user/atguigu/output/input.har
(4)解歸檔檔案
[[email protected] hadoop-2.7.2]$ hadoop fs -cp har:/// user/atguigu/output/input.har/* /user/atguigu