(二)HDFS——節點分析及新特性

接上篇:(一)HDFS的認識及使用Java對其的簡單操作

一、NameNode和SecondaryNameNode

1.NN和2NN工作機制

NameNode中的元數據是存儲在哪裏的?
  首先,假設存儲在NameNode節點中的磁盤中,因爲經常需要進行隨機訪問,還有響應客戶請求,必然是效率過低。因此,元數據需要存放在內存中。但如果只存在內存中,一旦斷電,元數據丟失,整個集羣就無法工作了。因此產生在磁盤中備份元數據的FsImage。
這樣又會帶來新的問題,當在內存中的原始數據更新時,如果同時更新FsImage,就會導致效率過低,但如果不更新,就會發生不一致性問題,一旦NameNode節點斷電,就會產生數據丟失。因此,引入Edits文件(只進行追加操作,效率很高)。每當元數據有更新或者添加元數據時,修改內存中的元數據並追加到Edits中。這樣,一旦NameNode節點斷電,可以通過FsImage 和Edits的合併,合成元數據。
  但是,如果長時間添加數據到Edits中,會導致文該文件過大,效率降低,而且一旦斷電,恢復元數據需要的時間過長。因此,需要定期進行FsImage和Edits的合併,如果這個操作有NameNode節點完成,又會效率過低。因此,引入一個新節點SecondaryNameNode(簡稱2NN),專門用於FsImage和Edits的合併。

NN和2NN工作機制如圖所示:
在這裏插入圖片描述

  1. 第一個階段:NameNode啓動
    (1)第一次啓動NameNode格式化後,創建Fsimage和 Edits文件。如果不是第一次啓動,直接加載編輯日誌和鏡像文件到內存。
    (2)客戶端對元數據進行增刪改的請求。
    (3)NameNode記錄操作日誌,更新滾動日誌。
    (4)NameNode在內存中對元數據進行增刪改。
  2. 第二階段:SecondaryNameNode工作
    (1)SecondaryNameNode詢問NameNode是否需要CheckPonit。直接帶回NameNode是否檢查結果。
    (2)SecondaryNameNode請求執行CheckPoint。
    (3)NameNode滾動 正在寫的Edits日誌。
    (4)將滾動前的編輯日誌和鏡像文件拷貝到SecondaryNameNode。
    (5)SecondaryNameNode加載編輯日誌和鏡像文件到內存,併合並。
    (6)生成新的鏡像文件fsimage.chkpoint。
    (7)拷貝fsimage.chkploint 到 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中。

2.Fsimage 和 Edits解析

1. 概念
  NameNode背個時候,將在/opt/moudule/hadoop-2.7.2/data/tmp/dfs/name/current 目錄中產生如下文件。
在這裏插入圖片描述(1)Fsimage 文件:HDFS文件系統元數據的一個永久性的檢查點,其中包含HDFS文件系統的所有目錄和文件idnode的序列化信息。
(2)Edits文件:存放HDFS文件系統的所有更新操作的路徑,文件系統客戶端執行的所有寫操作首先會被記錄到Edits文件中。
(3)seen_txid文件保存的是一個數字,就是最後一個edits_的數字。
(4)每次NameNode啓動的時候都會將Fsimage文件讀入內存,加載Edits裏面的更新操作,保證內存中的元數據信息是最新的、同步的,可以看成NameNode啓動的時候將Fsimage和Edits文件進行了合併。

2. oiv查看Fsimage文件
(1)查看oiv 和 oev命令

(2)基本語法
hdfs oiv -p 文件類型 -i 鏡像文件 -o 轉換後文件輸出路徑

(3)案例實操

3. oev查看Edits文件
(1)基本語法
hdfs oev -p 文件類型 -i編輯日誌 -o 轉換後文件輸出路徑

(2)案例實操

3.CheckPoint時間設置

(1)通常情況下,SecondaryNameNode每隔一小時執行一次。
在默認配置文件裏:
【hdfs-default.xml】

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property>

(2)一分鐘檢查一次操作次數,當操作次數達到一百萬時,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 >

4.NameNode故障處理

NameNode故障後,可以採用如下兩種方法恢復數據。
方法一:將secondaryNameNode中數據拷貝到NameNode存儲數據的目錄。
(1)kill -9 NameNode 進程
(2)刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

(3)拷貝SecondaryNameNode中數據到遠NameNode存儲數據目錄

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

(4)重新啓動NameNode

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)

rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

(4)如果SecondaryNameNode不和NameNode在一個主機節點上,需要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件。
(5)導入檢查點數據(等待一會Ctrl+c結束掉)

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

(6)啓動NameNode

hadoop-daemon.sh start namenode

5.集羣安全模式

  1. 概述
    (1)NameNode啓動
      NameNode啓動時,首先將鏡像文件(Fsimage)載入內存,並執行編輯日誌(Edits)中的各項操作。一旦在內存中成功建立文件系統元數據的映像,則創建一個新的Fsimage文件和一個空的編輯日誌。此時,NameNode開始監聽DataNode請求。這個過程期間,NameNode一直運行在安全模式,即NameNode的文件系統對於客戶端來說是隻讀的。
    (2)DataNode啓動
      系統中的數據塊的位置並不是由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 (功能描述:等待安全模式狀態)

6.NameNode多目錄配置

  1. NameNode的本地目錄可以配置成多個,且每個目錄存放內容相同,增加了可靠性
  2. 具體配置如下:
    (1)在hdfs-site.xml文件中增加如下內容
<property>
    <name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>

(2)停止集羣,刪除 data 和 logs 中所有數據。

[fseast@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
[fseast@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
[fseast@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/

(3)格式化集羣並啓動

[fseast@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode –format
[fseast@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

(4)查看結果

[fseast@hadoop102 dfs]$ ll
總用量 12
drwx------. 3 fseast fseast 4096 12月 11 08:03 data
drwxrwxr-x. 3 fseast fseast 4096 12月 11 08:03 name1
drwxrwxr-x. 3 fseast fseast 4096 12月 11 08:03 name2

二、DataNode

1.DataNode工作機制

DataNode工作機制如圖所示:
DataNode工作機制(1)一個數據塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個數據本身,一個是元數據包括數據庫的長度,塊數據的校驗和,以及時間戳。
(2)DataNode啓動後向NameNode註冊,通過後,週期性(1小時)的向NameNode上報所有的塊信息。
(3)心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如複製塊數據到另一臺機器,或者刪除某一個數據塊。如果超過10分鐘沒有收到某個DataNode的心跳,則認爲該節點不可用。
(4)集羣運行中可以安全加入和退出一些機器。

2.數據完整性

【思考】如果電腦磁盤裏面存儲的數據是控制高鐵信號燈的紅燈信號(1)和綠燈信號(2),但是存儲該數據的磁盤壞了,一直顯示是綠燈,是否很危險?同理DataNode節點上的數據損壞了,卻沒有發現,是否也很危險,那麼如果解決呢?
  如下是DataNode節點保證數據完整性的方法:
(1)當DataNode讀取Block的時候,它會計算CheckSum。
(2)如果計算後的CheckSum,與Block創建時值不一樣,說明Block已經損壞。
(3)Client讀取其他DataNode上的Block。
(4)DataNode在其他文件創建後周期驗證CheckSum,如圖所示:
在這裏插入圖片描述

3.掉線時限參數設置

  1. DataNode進程死亡或者網絡故障造成DataNode無法與NameNode通信。
  2. NameNode不會立即把該節點判定爲死亡,要經過一段時間,這段時間暫稱作超時時長。
  3. HDFS默認的超時時長爲10分鐘+30秒。
  4. 如果定義超時時間爲TimeOut,則超時時長的計算公式爲:
TimeOut  = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

而默認的dfs.namenode.heartbeat.recheck-interval 大小爲5分鐘,dfs.heartbeat.interval默認爲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>

4.服役新數據節點

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

  1. 環境準備:
    (1)準備新的節點hadoop105,修改IP地址和主機名
    (2)把hadoop104用到的相關軟件及配置信息拷貝過去。
    (3)刪除原來HDFS文件系統留存的文件(/opt/module/hadoop-2.7.2/data和log)
    (4)source 一下配置文件 source /etc/profile

  2. 服役新節點具體步驟
    (1)直接啓動DataNode,即關聯集羣

[fseast@hadoop105 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
[fseast@hadoop105 hadoop-2.7.2]$ yarn-daemon.sh start nodemanager

(2)在hadoop105上上傳文件

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

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

[fseast@hadoop102 sbin]$ ./start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-fseast-balancer-hadoop102.out
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

5.退役舊數據節點

5.1添加白名單

  添加到白名單的主機節點,都允許訪問NameNode,不在白名單的主機節點,都會被退出。
配置白名單的具體步驟如下:(操作退出hadoop105)
(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下創建dfs.hosts文件

[fseast@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[fseast@hadoop102 hadoop]$ touch dfs.hosts
[fseast@hadoop102 hadoop]$ vim 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)配置文件分發到其他節點

(4)刷新NameNode

hdfs dfsadmin -refreshNodes

(5)更新ResourceManager節點

[fseast@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes

(6)在web瀏覽器上查看

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

start-balancer.sh

5.2黑名單退役

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

  1. 在NameNode 的 /opt/module/hadoop-2.7.2/etc/hadoop目錄下創建dfs.hosts.exclude文件,並在該文件中添加如下主機名稱(要退役的節點):
hadoop105
  1. 在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>
  1. 刷新NameNode、刷新ResourceManager
[fseast@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
[fseast@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
  1. 檢查Web瀏覽器,退役節點的狀態爲 Decommission In Progress(退役中),說明數據節點正在複製快到其他節點。

  2. 等待退役節點狀態爲Decommissioned(所有塊已經複製完成),停止該節點及節點資源管理器。注意:如果副本數是3,服役的節點小於等於3, 是不能退役成功的,需要修改副本數後才能退役。
    停止該節點:hadoop-daemon.sh stop datanode
    停止該節點資源管理器:yarn-daemon.sh stop nodemanager

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

start-balancer.sh

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

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>

三、HDFS 2.X 新特性

1.集羣間數據拷貝

  1. scp 實現兩個遠程主機之間的文件複製
scp -r hello.txt root@hadoop103:/user/fseast/hello.txt		// 推 push

scp -r root@hadoop103:/user/fseast/hello.txt  hello.txt		// 拉 pull

scp -r root@hadoop103:/user/fseast/hello.txt root@hadoop104:/user/fseast
//是通過本地主機中轉實現兩個遠程主機的文件複製;如果在兩個遠程主機之間ssh沒有配置的情況下可以使用該方式。

  1. 採用 distcp 命令實現兩個Hadoop 集羣之間的遞歸數據複製。

2.小文件存檔

  1. HDFS存儲小文件弊端
      每個文件均按塊存儲,每個塊的元數據存儲在NameNode的內存中,因此HDFS存儲小文件會非常低效。因爲大量的小文件會耗盡NameNode中的大部分內存。但注意,存儲小文件所需要的磁盤容量和數據塊的大小無關。例如,一個1MB的文件設置而爲128MB的塊存儲,實際使用的是1MB的磁盤空間,而不是128MB。
  2. 解決存儲小文件辦法之一
      HDFS存檔文件或HAR文件,是一個更高效的文件存檔工具,它將文件存入HDFS塊,在減少NameNode內存使用的同時,允許對文件進行透明的訪問。具體來說,HDFS存檔文件對內還是一個一個獨立文件,對NameNode而言卻是一個整體,減少NameNode的內存。
    在這裏插入圖片描述
  3. 實例操作
    (1)需要啓動YARN進程
start-yarn.sh

(2)歸檔文件
  把/user/fseast/input 目錄裏面的所有文件歸檔成一個叫input.har 的歸檔文件,並把歸檔後文件存儲到/user/fseast/input/output 路徑下。

hadoop archive -archiveName input.har –p  /user/fseast/input   /user/fseast/output

(3)查看歸檔

hadoop fs -lsr /user/fseast/output/input.har
hadoop fs -lsr har:///user/fseast/output/input.har

(4)解歸檔文件

hadoop fs -cp har:/// user/fseast/output/input.har/*    /user/fseast
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章