天天看點

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

接上篇,上篇文章傳送門: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所示。

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

圖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所示。

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

圖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所示。

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

6.3 掉線時限參數設定

1、DatalNode程序死亡或者網絡故障造成DataNode無法與NameNode通信

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

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)試試,要永久關閉

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

(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浏覽器上檢視

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

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所示

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

圖3-17 退役中

5.等待退役節點狀态為decommissioned(所有塊已經複制完成),停止該節點及節點資料總管。注意:如果副本數是3,服役的節點小于等于3,是不能退役成功的,需要修改副本數後才能退役,如圖3-18所示

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

圖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]記憶體。

HDFS(下):NameNode和SecondaryNameNode、HDFS工作機制、故障處理、叢集安全模式、服役退役節點、叢集黑白名單、DataNode多目錄詳解、HDFS2.x新特性

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
           

繼續閱讀