HDFS 系列五:DataNode 工作機制

5. DataNode 工作機制

5.1 DataNode工作機制

image

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

  2. DataNode 啓動後向 Namenode 註冊,通過後,週期性(1小時)的向 Namenode 上報所有的塊信息

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

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

5.2 數據完整性

  1. 當 DataNode 讀取 block 的時候,它會計算 checksum

  2. 如果計算後的 checksum,與 block 創建時值不一樣,說明 block 已經損壞

  3. client 讀取其他 DataNode 上的 block.

  4. DataNode 在其文件創建後周期驗證 checksum

5.3 掉線時限參數設置

Datanode 進程死亡或者網絡故障造成 Datanode 無法與 Namenode 通信,Namenode 不會立即把該節點判定爲死亡,要經過一段時間,這段時間暫稱作超時時長

HDFS 默認的超時時長爲 10分鐘 + 30秒

如果定義超時時間爲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>

5.4 DataNode 的目錄結構

和 Namenode 不同的是,Datanode 的存儲目錄是初始階段自動創建的,不需要額外格式化

5.4.1 查看 DataNode 的版本號

在 /usr/local/hadoop/tmp/dfs/data/current 這個目錄下查看版本號

[root@slave1 current]# cat VERSION 
#Fri Mar 06 16:58:36 CST 2020
storageID=DS-7908c807-e3ec-4b85-952a-922ba8d3a24f
clusterID=CID-f383d6c4-da30-47c7-beb6-02c589c47f27
cTime=0
datanodeUuid=f230ca32-5797-4949-b996-95bf66a25a0d
storageType=DATA_NODE
layoutVersion=-57

5.4.2 DataNode 版本號具體解釋

  1. storageID:存儲id號

  2. clusterID:集羣id,全局唯一

  3. cTime:標記了 Datanode 存儲系統的創建時間,對於剛剛格式化的存儲系統,這個屬性爲0;但是在文件系統升級之後,該值會更新到新的時間戳

  4. datanodeUuid:Datanode 的唯一識別碼

  5. storageType:存儲類型

  6. layoutVersion: 是一個負整數,通常只有HDFS增加新特性時纔會更新這個版本號

5.4.3 DataNode 數據塊版本號

在 /usr/local/hadoop/tmp/dfs/data/current/BP-116957957-192.168.27.101-1582684942545/current 這個目錄下查看該數據塊的版本號

[root@slave1 current]# pwd
/usr/local/hadoop/tmp/dfs/data/current/BP-116957957-192.168.27.101-1582684942545/current
[root@slave1 current]# cat VERSION 
#Fri Mar 06 16:58:36 CST 2020
namespaceID=866472014
cTime=1582684942545
blockpoolID=BP-116957957-192.168.27.101-1582684942545
layoutVersion=-57

5.4.4 DataNode 數據塊版本號的具體解釋

  1. namespaceID:是 Datanode 首次訪問 Namenode 的時候從 Namenode 處獲取的 storageID; 對每個 Datanode 來說是唯一的(但對於單個 Datanode 中所有存儲目錄來說則是相同的),Namenode 可用這個屬性來區分不同 Datanode

  2. cTime:標記了 Datanode 存儲系統的創建時間,對於剛剛格式化的存儲系統,這個屬性爲0;但是在文件系統升級之後,該值會更新到新的時間戳

  3. blockpoolID:一個 block pool id 標識一個block pool,並且是跨集羣的全局唯一;當一個新的 Namespace 被創建的時候(format過程的一部分)會創建並持久化一個唯一ID;在創建過程構建全局唯一的 lockPoolID 比人爲的配置更可靠一些。Namenode 將 BlockPoolID 持久化到磁盤中,在後續的啓動過程中,會再次 load 並使用

  4. layoutVersion:一個負整數,通常只有 HDFS 增加新特性時纔會更新這個版本號

5.5 服役新數據節點

5.5.1 需求

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

5.5.2 環境準備

  1. 克隆一臺虛擬機(master -> slave3),並啓動

    從 master 上克隆可節省文件同步的時間,否則需要重新安裝、配置 JDK、Hadoop

  2. 修改 ip 地址爲 192.168.27.104

  3. 修改 ip 映射(/etc/hosts),並在 master、slave1、slave2 上同步修改

    在 master、slave1、slave2 基礎上新增 192.168.27.104 slave3

    192.168.27.101 master
    192.168.27.102 slave1
    192.168.27.103 slave2
    192.168.27.104 slave3
    
  4. 修改主機名

    hostnamectl set-hostname slave3
    
  5. 建立 master、slave1、slave2 和 slave3 之間的免密

    刪除 slave3 下的 .ssh,重新生成公鑰進行同步

以上五步可參考 Hadoop集羣搭建-3

  1. 刪除原來 HDFS 文件系統留存的文件

    從 master 上拷貝過來的 Hadoop 信息,清除 logs 和 data

    rm -rf /usr/hadoop/hadoop-2.9.2/logs /usr/local/hadoop/tmp/dfs/data
    

    因爲 msater 上沒跑 Datanode,所以 data 的目錄可以不加

所有準備工作完備

5.5.3 服役新節點具體步驟

  1. 在 Namenode 的 ~/etc/hadoop 目錄下創建 dfs.hosts 文件

    [root@master .ssh]# cd /usr/hadoop/hadoop-2.9.2/etc/hadoop/
    [root@master hadoop]# vim dfs.hosts
    

    添加如下主機名稱(包含新服役的節點)

    master
    slave1
    slave2
    slave3
    
  2. 在 Namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts 屬性

    <property>
        <name>dfs.hosts</name>
        <value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts</value>
    </property>
    
  3. 刷新 Namenode

    [root@master hadoop]# hdfs dfsadmin -refreshNodes
    Refresh nodes successful
    

    image

    新增了 master、slave3 的 Datanode 節點

  4. 更新 resourcemanager 節點

    [root@master hadoop]# yarn rmadmin -refreshNodes
    20/03/06 15:07:16 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.27.101:8033
    
  5. 在 Namenode 的 slaves 文件中增加新主機名稱

    增加 master、slave3 不需要分發

    master
    slave1
    slave2
    slave3
    
  6. 單獨命令啓動新的數據節點和節點管理器

    master、slave3 上都啓動 Datanode 和 NodeManager

    [root@slave3 hadoop-2.9.2]# hadoop-daemon.sh start datanode
    starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-slave3.out
    [root@slave3 hadoop-2.9.2]# yarn-daemon.sh start nodemanager
    starting nodemanager, logging to /usr/hadoop/hadoop-2.9.2/logs/yarn-root-nodemanager-slave3.out
    
    [root@slave3 hadoop-2.9.2]# jps
    3154 DataNode
    3266 NodeManager
    3423 Jps
    

    確認 DataNode 和 NodeManager 進程已啓動

  7. 在 web 瀏覽器上檢查是否 ok

    image

    目前只啓動了 slave3 節點上的 Datanode 和 NodeManager

5.5.4 集羣再平衡

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

[root@slave1 .ssh]# start-balancer.sh
starting balancer, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-balancer-slave1.out
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

重新配置 192.168.27.105 slave4,作爲後續舊數據節點的退役

5.6 退役舊數據節點

此例退役上面剛服役的節點: 192.168.27.105 slave4

  1. 在 Namenode 的 ~/etc/hadoop 目錄下創建 dfs.hosts.exclude 文件

    [root@master hadoop]# pwd
    /usr/hadoop/hadoop-2.9.2/etc/hadoop
    [root@master hadoop]# vim dfs.hosts.exclude
    

    添加如下主機名稱(要退役的節點)

    slave4
    
  2. 在 Namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts.exclude 屬性

    <property>
        <name>dfs.hosts.exclude</name>
        <value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts.exclude</value>
    </property>
    
  3. 刷新 Namenode、刷新 Resourcemanager

    [root@master hadoop]# hdfs dfsadmin -refreshNodes
    Refresh nodes successful
    [root@master hadoop]# yarn rmadmin -refreshNodes
    20/03/06 15:58:31 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.27.101:8033
    
  4. 檢查 web 瀏覽器,退役節點的狀態 無(退役中),說明數據節點正在複製塊到其他節點

    image

  5. 等待退役節點狀態爲 decommissioned(所有塊已經複製完成),停止該節點及節點資源管理器

    image

    此時,slave4 上的 DataNode 和 NodeManager 進程仍在

    [root@slave4 hadoop]#  jps
    5232 NodeManager
    5563 Jps
    5116 DataNode
    

    注意:如果副本數是3,服役的節點小於等於3,是不能退役成功的,需要修改副本數後才能退役

    停止該節點及節點資源管理器

    [root@slave4 hadoop]# hadoop-daemon.sh stop datanode
    stopping datanode
    [root@slave4 hadoop]# yarn-daemon.sh stop nodemanager
    stopping nodemanager
    
  6. 從 include 文件中刪除退役節點,再運行刷新節點的命令

    (1) 從 Namenode 的 dfs.hosts 文件中刪除退役節點 slave4

     master
     slave1
     slave2
     slave3
    

    (2) 刷新 Namenode,刷新 Resourcemanager

    [root@master hadoop]# hdfs dfsadmin -refreshNodes
    Refresh nodes successful
    [root@master hadoop]# yarn rmadmin -refreshNodes
    20/03/06 17:11:21 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.27.101:8033
    
  7. 從 Namenode 的 slave 文件中刪除退役節點 hadoop105

    master
    slave1
    slave2
    slave3
    
  8. 如果數據不均衡,可以用命令實現集羣的再平衡

    [root@master hadoop]# start-balancer.sh 
    starting balancer, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-balancer-master.out
    Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
    

5.7 Datanode 多目錄配置

Datanode 也可以配置成多個目錄,每個目錄存儲的數據不一樣,即數據不是副本

具體配置如下:

[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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章