Hadoop-HDFS

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

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集群(方便後續的測試)
[[email protected] hadoop-2.7.2]$ sbin/start-dfs.sh
[[email protected] hadoop-2.7.2]$ sbin/start-yarn.sh1)-help:輸出這個命令參數
[[email protected] hadoop-2.7.2]$ hadoop fs -help rm2)-ls: 顯示目錄信息
[[email protected] hadoop-2.7.2]$ hadoop fs -ls /3)-mkdir:在HDFS上創建目錄
[[email protected] hadoop-2.7.2]$ hadoop fs -mkdir -p /sanguo/shuguo
(4)-moveFromLocal:從本地剪切粘貼到HDFS
[[email protected] hadoop-2.7.2]$ touch kongming.txt
[[email protected] hadoop-2.7.2]$ hadoop fs  -moveFromLocal  ./kongming.txt  /sanguo/shuguo
(5)-appendToFile:追加一個文件到已經存在的文件末尾
[[email protected] hadoop-2.7.2]$ touch liubei.txt
[[email protected] hadoop-2.7.2]$ vi liubei.txt
輸入
san gu mao lu
[[email protected] hadoop-2.7.2]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(6)-cat:顯示文件內容
[[email protected] hadoop-2.7.2]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
(7)-chgrp 、-chmod、-chown:Linux文件系統中的用法一樣,修改文件所屬許可權
[[email protected] hadoop-2.7.2]$ hadoop fs  -chmod  666  /sanguo/shuguo/kongming.txt
[[email protected] hadoop-2.7.2]$ hadoop fs  -chown  atguigu:atguigu   /sanguo/shuguo/kongming.txt
(8)-copyFromLocal:從本地文件系統中拷貝文件到HDFS路徑去
[[email protected] hadoop-2.7.2]$ hadoop fs -copyFromLocal README.txt /9)-copyToLocal:從HDFS拷貝到本地
[[email protected] hadoop-2.7.2]$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./10)-cp :從HDFS的一個路徑拷貝到HDFS的另一個路徑
[[email protected] hadoop-2.7.2]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
(11)-mv:在HDFS目錄中移動文件
[[email protected] hadoop-2.7.2]$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/12)-get:等同於copyToLocal,就是從HDFS下載文件到本地
[[email protected] hadoop-2.7.2]$ hadoop fs -get /sanguo/shuguo/kongming.txt ./13)-getmerge:合併下載多個文件,比如HDFS的目錄 /user/atguigu/test下有多個文件:log.1, log.2,log.3,...
[[email protected] hadoop-2.7.2]$ hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
(14)-put:等同於copyFromLocal
[[email protected] hadoop-2.7.2]$ hadoop fs -put ./zaiyiqi.txt /user/atguigu/test/
(15)-tail:顯示一個文件的末尾
[[email protected] hadoop-2.7.2]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
(16)-rm:刪除文件或文件夾
[[email protected] hadoop-2.7.2]$ hadoop fs -rm /user/atguigu/test/jinlian2.txt
(17)-rmdir:刪除空目錄
[[email protected] hadoop-2.7.2]$ hadoop fs -mkdir /test
[[email protected] hadoop-2.7.2]$ hadoop fs -rmdir /test
(18)-du統計文件夾的大小信息
[[email protected] hadoop-2.7.2]$ hadoop fs -du -s -h /user/atguigu/test
2.7 K  /user/atguigu/test
[[email protected] 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中文件的副本數量
[[email protected] 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文件

[[email protected] 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
[[email protected] current]$ 
[[email protected] current]$ cat seen_txid  //文件保存的是一個數字,就是最後一個edit_數字

[[email protected] current]$ hdfs oiv -p XML -i fsimage_0000000000000000258 -o /opt/module/hadoop-2.7.2/fsimage.xml
[[email protected] 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)

[[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

[[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結束掉)

[[email protected] hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint

6. 啟動NameNode

[[email protected] 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一下配置文件

[[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

(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

退役舊數據節點

添加白名單

添加到白名單的主機節點都允許訪問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

黑名單退役

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

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

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

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

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

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 [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

小文件存檔

案例實操

(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

 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

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

更多相關文章
  • " 返回《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伺服器的簡單實例: [[email protected]]# mysql -u root -p Enter password:****** 或者: [email protected]:~ $ sudo mysql 查看資料庫: mysql> SHO ...
一周排行
  • 前幾天發佈了 "抄抄《CSS 故障藝術》的動畫" 這篇文章,在這篇文章里介紹瞭如何使用Win2D繪製文字然後配合BlendEffect製作故障藝術的動畫。本來打算就這樣收手不玩這個動畫了,但後來又發現性能不符合理想。明明只是做做Resize動畫和用BlendEffect混合,為什麼性能會這麼差呢? ...
  • 控制條控制項: progressBar 不能按照你程式的進程自動變化,需認為計算,調整變化量 private void progressBar1_Click(object sender, EventArgs e) { this.progressBar1.Maximum = 100;//設置進度條最大長 ...
  • 首先創建一個asp.net core web應用程式 第二步 目前官方預置了7種模板項目供我們選擇。從中我們可以看出,既有我們熟悉的MVC、WebAPI,又新添加了Razor Page,以及結合比較流行的Angular、React前端框架的模板項目。 空項目模板 Program.cs using S ...
  • 對閉包的理解 1.對於成員變數和局部變數:成員變數就是方法外部,類的內部定義的變數;局部變數就是方法或語句塊內部定義的變數。局部變數必須初始化。 形式參數是局部變數,局部變數的數據存在於棧記憶體中。棧記憶體中的局部變數隨著方法的消失而消失。成員變數存儲在堆中的對象裡面,由垃圾回收器負責回收。 成員變數它 ...
  • Xamarin.Forms讀取並展示Android和iOS通訊錄 TerminalMACS客戶端 本文同步更新地址: https://dotnet9.com/11520.html https://terminalmacs.com/861.html 閱讀導航: 一、功能說明 二、代碼實現 三、源碼獲取 ...
  • 做下對文件複製操作相關的筆記: /// <summary> /// 文件幫助類 /// </summary> public class FileHelper { /// <summary> /// 複製一個目錄下所有文件到一個新目錄下 /// </summary> /// <param name=" ...
  • 前言 有一個東西叫做鴨子類型,所謂鴨子類型就是,只要一個東西表現得像鴨子那麼就能推出這玩意就是鴨子。 C 裡面其實也暗藏了很多類似鴨子類型的東西,但是很多開發者並不知道,因此也就沒法好好利用這些東西,那麼今天我細數一下這些藏在編譯器中的細節。 不是只有 和 才能 在 C 中編寫非同步代碼的時候,我們經 ...
  • [toc] 1.應用背景 底端設備有大量網路報文(位元組數組):心跳報文,數據採集報文,告警報文上報。需要有對應的報文結構去解析這些位元組流數據。 2.結構體解析 由此,我第一點就想到了用結構體去解析。原因有以下兩點: 2.1.結構體存在棧中 類屬於引用類型,存在堆中;結構體屬於值類型,存在棧中,在一個 ...
  • 《深入淺出 C#》 (第3版) [作者] (美) Andrew Stellman (美) Jennifer Greene[譯者] (中) 徐陽 丁小峰 等譯[出版] 中國電力出版社[版次] 2016年08月 第1版[印次] 2018年04月 第4次 印刷[定價] 148.00元 【引子】 要學習編程 ...
  • 記錄使用對象初始值設定項初始化對象。 using System; using System.Collections.Generic; namespace ConsoleApp2 { class Program { static void Main(string[] args) { // 使用構造函數 ...
x