Hadoop-HDFS

来源:https://www.cnblogs.com/gllyun/archive/2020/02/17/12321091.html
-Advertisement-
Play Games

HDFS(Hadoop Distributed File System) 分散式文件系統,HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用.由NameNode,若幹DataNode,以及Secondary NameNode組成。 ...


HDFS(Hadoop Distributed File System) 分散式文件系統,HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用.由NameNode,若幹DataNode,以及Secondary NameNode組成。

 HDFS組成架構

 

 HDFS文件塊大小:

 

 HDFS客戶端Shell操作

常用命令實操
(0)啟動Hadoop集群(方便後續的測試)
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh1)-help:輸出這個命令參數
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -help rm2)-ls: 顯示目錄信息
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -ls /3)-mkdir:在HDFS上創建目錄
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /sanguo/shuguo
(4)-moveFromLocal:從本地剪切粘貼到HDFS
[atguigu@hadoop102 hadoop-2.7.2]$ touch kongming.txt
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs  -moveFromLocal  ./kongming.txt  /sanguo/shuguo
(5)-appendToFile:追加一個文件到已經存在的文件末尾
[atguigu@hadoop102 hadoop-2.7.2]$ touch liubei.txt
[atguigu@hadoop102 hadoop-2.7.2]$ vi liubei.txt
輸入
san gu mao lu
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(6)-cat:顯示文件內容
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
(7)-chgrp 、-chmod、-chown:Linux文件系統中的用法一樣,修改文件所屬許可權
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs  -chmod  666  /sanguo/shuguo/kongming.txt
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs  -chown  atguigu:atguigu   /sanguo/shuguo/kongming.txt
(8)-copyFromLocal:從本地文件系統中拷貝文件到HDFS路徑去
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -copyFromLocal README.txt /9)-copyToLocal:從HDFS拷貝到本地
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./10)-cp :從HDFS的一個路徑拷貝到HDFS的另一個路徑
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
(11)-mv:在HDFS目錄中移動文件
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/12)-get:等同於copyToLocal,就是從HDFS下載文件到本地
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -get /sanguo/shuguo/kongming.txt ./13)-getmerge:合併下載多個文件,比如HDFS的目錄 /user/atguigu/test下有多個文件:log.1, log.2,log.3,...
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
(14)-put:等同於copyFromLocal
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put ./zaiyiqi.txt /user/atguigu/test/
(15)-tail:顯示一個文件的末尾
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
(16)-rm:刪除文件或文件夾
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rm /user/atguigu/test/jinlian2.txt
(17)-rmdir:刪除空目錄
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir /test
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rmdir /test
(18)-du統計文件夾的大小信息
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -du -s -h /user/atguigu/test
2.7 K  /user/atguigu/test
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -du  -h /user/atguigu/test
1.3 K  /user/atguigu/test/README.txt
15     /user/atguigu/test/jinlian.txt
1.4 K  /user/atguigu/test/zaiyiqi.txt
(19)-setrep:設置HDFS中文件的副本數量
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
                                              圖3-3  HDFS副本數量
這裡設置的副本數只是記錄在NameNode的元數據中,是否真的會有這麼多副本,還得看DataNode的數量。因為目前只有3台設備,最多也就3個副本,只有節點數的增加到10台時,副本數才能達到10。

HDFS讀寫流程

HDFS寫流程(上傳文件)

 

1)客戶端通過Distributed FileSystem模塊NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。

2NameNode返回是否可以上傳。

3)客戶端請求第一個 Block上傳到哪幾個DataNode伺服器上。

4NameNode返回3DataNode節點,分別為dn1、dn2、dn3。

5)客戶端通過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,然後dn2調用dn3,將這個通信管道建立完成。

6dn1、dn2、dn3逐級應答客戶端。

7)客戶端開始往dn1上傳第一個Block(先從磁碟讀取數據放到一個本地記憶體緩存),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答

8)當一個Block傳輸完成之後,客戶端再次請求NameNode上傳第二個Block的伺服器。(重覆執行3-7步)。

在HDFS寫數據的過程中,NameNode選擇距離待上傳數據最近距離DataNode接收數據。那麼這個最近距離怎麼計算呢

節點距離:兩個節點到達最近的共同祖先的距離總和。

DN1是最近的,DN2和DN3是根據第一個節點DN1選出來的;

第二次的DN4、DN5、DN6可能跟第一次傳輸的DN一樣,也可能不一樣取決於內部集群的狀況;兩次返回的DN都是獨立的。

N1與N2之間的距離為2;(找線條數)

假設N1、N2、N3三台機器,從N1上傳數據,則最短的節點就是它本身0;

後兩個的選擇是根據機架感知來選:

HDFS讀數據流程(下載)

 

1)客戶端通過Distributed FileSystemNameNode請求下載文件,NameNode通過查詢元數據,找到文件塊所在的DataNode地址。

2)挑選一臺DataNode就近原則,然後隨機)伺服器,請求讀取數據

3DataNode開始傳輸數據給客戶端(從磁碟裡面讀取數據輸入流,以Packet為單位來做校驗)。

4)客戶端以Packet為單位接收,先在本地緩存,然後寫入目標文件。

NameNode和SecondaryNameNode

NN和2NN工作機制

思考NameNode存儲在哪裡?

如果將NameNode節點元數據存於磁碟中,因為需要經常進行隨機訪問,且還響應客戶端的請求,效率低下。因此,要將元數據防於記憶體中,但是如果斷電,記憶體中的數據就會丟失,集群無法工作了。因此在磁碟中備份元數據的FsImage。

但是這樣會帶來新的問題就是,在更新記憶體中的數據同時,還要同時更新FsImage,這樣效率低下,因此,引入Edits文件(只進行追加操作,效率很高)。每當元數據有更新或者添加元數據時,修改記憶體中的元數據並追加到Edits中。這樣,一旦NameNode節點斷電,可以通過FsImageEdits的合併,合成元數據。

但是如果長時間添加數據到Edits中,導致文件過大,如果某天斷電,那麼回覆元數據時間很長,因此,需要定期合併FsImage和Edits文件,但是這個操作由NameNode節點完成,效率低下。因此引入新節點SecondaryNameNode,專門用於FsImage和Rdits定期合併。

NN和2NN工作機制如圖所示:

 Fsimage:NameNode記憶體中元數據序列化後形成的文件。包含HDFS文件系統的所有目錄和文件inode的序列化信息;是HDFS文件系統元數據的永久性檢查點;

 Edits:記錄客戶端更新--增刪改元數據信息的每一步操作。

 NameNode啟動時,先滾動Edits並生成一個空的edits.inprogress,然後載入Edits和Fsimage到記憶體中,此時NameNode記憶體就持有最新的元數據信息。

1. 第一階段:NameNode啟動

1)第一次啟動NameNode格式化後創建Fsimage和Edits文件。如果不是第一次啟動,直接載入編輯日誌和鏡像文件到記憶體。

2客戶端對元數據進行增刪改的請求

3NameNode記錄操作日誌,更新滾動日誌

4NameNode在記憶體中對數據進行增刪改

2. 第二階段:Secondary NameNode工作

1Secondary NameNode詢問NameNode是否需要CheckPoint直接帶回NameNode是否檢查結果。

2Secondary NameNode請求執行CheckPoint。

3NameNode滾動正在寫的Edits日誌

4)將滾動前的編輯日誌和鏡像文件拷貝到Secondary NameNode。

5Secondary NameNode載入編輯日誌和鏡像文件到記憶體,併合並。

6生成新的鏡像文件fsimage.chkpoint。

7拷貝fsimage.chkpointNameNode

8NameNodefsimage.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中。

 Fsimage和Edits解析

 查看FsImage文件

[gll@hadoop101 current]$ ll
總用量 7256
-rw-rw-r--. 1 gll gll 1048576 1月  17 17:10 edits_0000000000000000001-0000000000000000001
-rw-rw-r--. 1 gll gll      42 1月  18 11:08 edits_0000000000000000002-0000000000000000003
-rw-rw-r--. 1 gll gll 1048576 1月  18 17:12 edits_0000000000000000004-0000000000000000020
-rw-rw-r--. 1 gll gll 1048576 1月  18 18:27 edits_0000000000000000021-0000000000000000021
-rw-rw-r--. 1 gll gll      42 1月  18 18:29 edits_0000000000000000022-0000000000000000023
-rw-rw-r--. 1 gll gll    3869 1月  18 19:29 edits_0000000000000000024-0000000000000000074
-rw-rw-r--. 1 gll gll     922 1月  18 20:29 edits_0000000000000000075-0000000000000000090
-rw-rw-r--. 1 gll gll 1048576 1月  18 20:37 edits_0000000000000000091-0000000000000000107
-rw-rw-r--. 1 gll gll      42 1月  19 11:28 edits_0000000000000000108-0000000000000000109
-rw-rw-r--. 1 gll gll      42 1月  19 12:28 edits_0000000000000000110-0000000000000000111
-rw-rw-r--. 1 gll gll      42 1月  19 13:28 edits_0000000000000000112-0000000000000000113
-rw-rw-r--. 1 gll gll    1276 1月  19 14:28 edits_0000000000000000114-0000000000000000127
-rw-rw-r--. 1 gll gll      42 1月  19 15:28 edits_0000000000000000128-0000000000000000129
-rw-rw-r--. 1 gll gll      42 1月  19 16:28 edits_0000000000000000130-0000000000000000131
-rw-rw-r--. 1 gll gll 1048576 1月  19 16:28 edits_0000000000000000132-0000000000000000132
-rw-rw-r--. 1 gll gll 1048576 1月  19 20:45 edits_0000000000000000133-0000000000000000133
-rw-rw-r--. 1 gll gll   14290 1月  20 12:24 edits_0000000000000000134-0000000000000000254
-rw-rw-r--. 1 gll gll      42 1月  20 13:24 edits_0000000000000000255-0000000000000000256
-rw-rw-r--. 1 gll gll      42 1月  20 14:24 edits_0000000000000000257-0000000000000000258
-rw-rw-r--. 1 gll gll 1048576 1月  20 14:24 edits_inprogress_0000000000000000259
-rw-rw-r--. 1 gll gll    2465 1月  20 13:24 fsimage_0000000000000000256
-rw-rw-r--. 1 gll gll      62 1月  20 13:24 fsimage_0000000000000000256.md5
-rw-rw-r--. 1 gll gll    2465 1月  20 14:24 fsimage_0000000000000000258
-rw-rw-r--. 1 gll gll      62 1月  20 14:24 fsimage_0000000000000000258.md5
-rw-rw-r--. 1 gll gll       4 1月  20 14:24 seen_txid
-rw-rw-r--. 1 gll gll     206 1月  20 11:36 VERSION
[gll@hadoop101 current]$ 
[gll@hadoop101 current]$ cat seen_txid  //文件保存的是一個數字,就是最後一個edit_數字

[gll@hadoop101 current]$ hdfs oiv -p XML -i fsimage_0000000000000000258 -o /opt/module/hadoop-2.7.2/fsimage.xml
[gll@hadoop101 current]$ sz /opt/module/hadoop-2.7.2/fsimage.xml

CheckPoint時間設置

1)通常情況下,SecondaryNameNode每隔一小時執行一次。

2)一分鐘檢查一次操作次數;

3 )當操作次數達到1百萬時,SecondaryNameNode執行一次。

NameNode故障處理

方法一:將SecondaryNameNode數據拷貝到NameNode存儲數據的目錄:但是這樣處理,2nn的數據有部分沒有合併,會不全,數據丟失。

1. kill -9 NameNode進程

2. 刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

3. 拷貝SecondaryNameNode中數據到原NameNode存儲數據目錄

[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/

4. 重新啟動NameNode

[atguigu@hadoop102 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)

[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

4. 如果SecondaryNameNode不和NameNode在一個主機節點上,需要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件

[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./

[atguigu@hadoop102 namesecondary]$ rm -rf in_use.lock

[atguigu@hadoop102 dfs]$ pwd

/opt/module/hadoop-2.7.2/data/tmp/dfs

[atguigu@hadoop102 dfs]$ ls

data  name  namesecondary

5. 導入檢查點數據(等待一會ctrl+c結束掉)

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint

6. 啟動NameNode

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

集群安全模式

集群處於安全模式,不能執行重要操作(寫操作)。集群啟動完成後,自動退出安全模式。
(1)bin/hdfs dfsadmin -safemode get     (功能描述:查看安全模式狀態)
(2)bin/hdfs dfsadmin -safemode enter   (功能描述:進入安全模式狀態)
(3)bin/hdfs dfsadmin -safemode leave   (功能描述:離開安全模式狀態)
(4)bin/hdfs dfsadmin -safemode wait    (功能描述:等待安全模式狀態)

DataNode工作機制

1一個數據塊在DataNode上以文件形式存儲在磁碟上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據校驗和,以及時間戳

2DataNode啟動後向NameNode註冊,通過後,周期性(1小時NameNode上報所有的塊信息。

3心跳是每3一次,心跳返回結果帶有NameNode給該DataNode的命令如複製塊數據到另一臺機器,或刪除某個數據塊如果超過10分鐘沒有收到某個DataNode的心跳,則認為該節點不可用。

4集群運行中可以安全加入和退出一些機器

DataNode數據完整性

1當DataNode讀取Block的時候,它會計算CheckSum

2如果計算後的CheckSum,與Block創建時值不一樣,說明Block已經損壞。

3Client讀取其他DataNode上的Block

4DataNode在其文件創建後周期驗證CheckSum,如圖3-16所示。

 DataNode掉線時限參數設置

 服役新數據節點

隨著公司業務的增長,數據量越來越,原有的數據節點的容量已經不能滿足存儲數據的需求,需要在原有集群基礎上動態添加的數據節點

1. 環境準備

1)在hadoop104主機克隆一臺hadoop105主機

2)修改IP地址和主機名稱

(3)刪除原來HDFS文件系統留存的文件/opt/module/hadoop-2.7.2/datalog

4source一下配置文件

[atguigu@hadoop105 hadoop-2.7.2]$ source /etc/profile

2. 服役新節點具體步驟

(1)直接啟動DataNode即可關聯到集群

[atguigu@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode

[atguigu@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager

(2)在hadoop105上上傳文件

[atguigu@hadoop105 hadoop-2.7.2]$ hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /

3)如果數據不均衡,可以用命令實現集群的再平衡

[atguigu@hadoop102 sbin]$ ./start-balancer.sh

starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out

退役舊數據節點

添加白名單

添加到白名單的主機節點都允許訪問NameNode不在白名單的主機節點,都會退出。

配置白名單的具體步驟如下:

1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下創建dfs.hosts文件
 [atguigu@hadoop102 hadoop]$ pwd
 /opt/module/hadoop-2.7.2/etc/hadoop
 [atguigu@hadoop102 hadoop]$ touch dfs.hosts
 [atguigu@hadoop102 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)配置文件分發
 [atguigu@hadoop102 hadoop]$ xsync hdfs-site.xml
(4)刷新NameNode
 [atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
 Refresh nodes successful
(5)更新ResourceManager節點
 [atguigu@hadoop102 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

黑名單退役

黑名單上面的主機都會被強制退出

1.NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄創建dfs.hosts.exclude文件

[atguigu@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[atguigu@hadoop102 hadoop]$ touch dfs.hosts.exclude
[atguigu@hadoop102 hadoop]$ vi dfs.hosts.exclude
添加如下主機名稱(要退役的節點)
hadoop105

2.在NameNodehdfs-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

[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
[atguigu@hadoop102 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所示

5.等待退役節點狀態decommissioned(所有塊已經複製完成),停止該節點及節點資源管理器。註意:如果副本數是3服役的節點小於等於3,是不能退役成功的,需要修改副本數後才能退役,如圖3-18所示

[atguigu@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager

6. 如果數據不均衡,可以用命令實現集群的再平衡

[atguigu@hadoop102 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

註意不允許白名單和黑名單同時出現同一個主機名稱

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>

HDFS2.x新特性

集群間數據拷貝

1.scp實現兩個遠程主機之間的文件複製
    scp -r hello.txt root@hadoop103:/user/atguigu/hello.txt        // 推 push
    scp -r root@hadoop103:/user/atguigu/hello.txt  hello.txt        // 拉 pull
    scp -r root@hadoop103:/user/atguigu/hello.txt root@hadoop104:/user/atguigu   //是通過本地主機中轉實現兩個遠程主機的文件複製;如果在兩個遠程主機之間ssh沒有配置的情況下可以使用該方式。
2.採用distcp命令實現兩個Hadoop集群之間的遞歸數據複製
[atguigu@hadoop102 hadoop-2.7.2]$  bin/hadoop distcp
hdfs://haoop102:9000/user/atguigu/hello.txt hdfs://hadoop103:9000/user/atguigu/hello.txt

小文件存檔

案例實操

(1)需要啟動YARN進程
[atguigu@hadoop102 hadoop-2.7.2]$ start-yarn.sh

(2)歸檔文件
把/user/atguigu/input目錄裡面的所有文件歸檔成一個叫input.har的歸檔文件,並把歸檔後文件存儲到/user/atguigu/output路徑下。
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop archive -archiveName input.har –p  /user/atguigu/input   /user/atguigu/output

(3)查看歸檔
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr /user/atguigu/output/input.har
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr har:///user/atguigu/output/input.har

(4)解歸檔文件
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cp har:/// user/atguigu/output/input.har/*    /user/atguigu

 HDFS HA高可用

HA概述

1)所謂HA(High Available),即高可用(7*24小時中段服務)

2)實現高可用最關鍵策略是消除單點故障。HA嚴格來說應該分成各個組件的HA機制HDFSHAYARNHA

3)Hadoop2.0之前,在HDFS集群中NameNode存在單點故障(SPOF

4) NameNode主要在以下兩個方面影響HDFS集群

  •    NameNode機器發生意外,如宕機,集群將無法使用,直到管理員重啟
  •    NameNode機器需要升級,包括軟體、硬體升級,此時集群也將無法使用 

HDFS HA功能通過配置Active/Standby兩個NameNodes實現在集群中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一臺機器。

 HDFS-HA工作機制

通過雙NameNode消除單點故障

 HDFS-HA工作要點

1. 元數據管理方式需要改變

記憶體中各自保存一份元數據;

Edits日誌只有Active狀態的NameNode節點可以做寫操作;

兩個NameNode都可以讀取Edits

共用的Edits放在一個共用存儲中管理qjournalNFS兩個主流實現);

2. 需要一個狀態管理功能模塊

實現了一個zkfailover,常駐在每一個namenode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,利用zk進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split現象的發生。

3. 必須保證兩個NameNode之間能夠ssh無密碼登錄

4. 隔離Fence同一時刻僅僅有一個NameNode對外提供服務

 HDFS-HA自動故障轉移機制  

故障轉移增加了zookeeper和ZKFS進程

Zookeeper:維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務

HA依賴zookeeper的一下功能:

1故障檢測:集群中的每個NameNodeZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移。

2現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode

ZKFC是自動故障轉移中的另一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:

1健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認為該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。

2ZooKeeper會話管理:當本地NameNode是健康的,ZKFC

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • " 返回《C 併發編程》" "1. 簡介" "2. 同步非同步對比" "3. 上下文的捕獲和恢復" "4. Flowing ExecutionContext vs Using SynchronizationContext" "5. 如何適用於 async/await" "5.1. 實現方式" "5.1 ...
  • WPF支持真正的透明效果。這意味著,如果在一個性質或元素上層疊另外幾個形狀或元素,並讓所有這些形狀和元素具有不同的透明度,就會看到所期望的效果。通過該特性能夠創建透過上面的元素可以看到的的圖像背景,這是最簡單的情形。最複雜的情形是,使用該特性可創建多層動畫和其他效果,對於其他框架來說這是很難實現的。 ...
  • redis集群搭建--參考微信公眾號(詩情畫意程式員):https://mp.weixin.qq.com/s/s5eJE801TInHgb8bzCapJQ 這是來自redis官網的一段介紹,大概意思就是: Redis是一個開源(BSD許可)的記憶體數據結構存儲,用作資料庫、緩存和消息代理。它支持諸如字 ...
  • 外部SRAM註意事項為使外部SRAM器件達到出最佳性能,建議遵循以下原則:使用與連接的主系統控制器的介面數據帶寬相同的SRAM。如果管腳使用或板上空間的限制高於系統性能要求,可以使用較連接的控制器的數據帶寬小一些的SRAM設備,以便減少管腳數量並減少PCB板上可能的存儲器數量。然而這種變化將導致降低 ...
  • [toc] I am a 程式猿兒,新年第一篇,今天推薦一下那些大神平常使用的電腦軟體和工具類網站,讓你秒變大神。 下麵的整理前面部分是基礎的軟體,做不做技術都需要安裝的一些,後面部分是對程式猿推薦的一些開發軟體和插件。 操作系統 1、微軟正版win10系統安裝:bai度搜索 下載Windows10 ...
  • 通過前面文章的學習已經掌握了Linux系統配置管理的知識,本文講解Centos7網路配置知識。 ...
  • 作為一名後端開發,MySQL的使用必不可少,合理的使用索引和索引調優是後端開發者必須掌握的技能之一。 ...
  • 1 環境 樹莓派: mysql: 2 指令 以下是從命令行中連接mysql伺服器的簡單實例: [root@host]# mysql -u root -p Enter password:****** 或者: pi@raspberrypi:~ $ sudo mysql 查看資料庫: mysql> SHO ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...