文章目錄
5. DataNode 工作機制
5.1 DataNode工作機制
-
一個數據塊在 Datanode 上以文件形式存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳
-
DataNode 啓動後向 Namenode 註冊,通過後,週期性(1小時)的向 Namenode 上報所有的塊信息
-
心跳是每 3 秒一次,心跳返回結果帶有 Namenode 給該 DataNode 的命令如複製塊數據到另一臺機器,或刪除某個數據塊。如果超過 10 分鐘沒有收到某個 DataNode 的心跳,則認爲該節點不可用
-
集羣運行中可以安全加入和退出一些機器
5.2 數據完整性
-
當 DataNode 讀取 block 的時候,它會計算 checksum
-
如果計算後的 checksum,與 block 創建時值不一樣,說明 block 已經損壞
-
client 讀取其他 DataNode 上的 block.
-
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 版本號具體解釋
-
storageID:存儲id號
-
clusterID:集羣id,全局唯一
-
cTime:標記了 Datanode 存儲系統的創建時間,對於剛剛格式化的存儲系統,這個屬性爲0;但是在文件系統升級之後,該值會更新到新的時間戳
-
datanodeUuid:Datanode 的唯一識別碼
-
storageType:存儲類型
-
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 數據塊版本號的具體解釋
-
namespaceID:是 Datanode 首次訪問 Namenode 的時候從 Namenode 處獲取的 storageID; 對每個 Datanode 來說是唯一的(但對於單個 Datanode 中所有存儲目錄來說則是相同的),Namenode 可用這個屬性來區分不同 Datanode
-
cTime:標記了 Datanode 存儲系統的創建時間,對於剛剛格式化的存儲系統,這個屬性爲0;但是在文件系統升級之後,該值會更新到新的時間戳
-
blockpoolID:一個 block pool id 標識一個block pool,並且是跨集羣的全局唯一;當一個新的 Namespace 被創建的時候(format過程的一部分)會創建並持久化一個唯一ID;在創建過程構建全局唯一的 lockPoolID 比人爲的配置更可靠一些。Namenode 將 BlockPoolID 持久化到磁盤中,在後續的啓動過程中,會再次 load 並使用
-
layoutVersion:一個負整數,通常只有 HDFS 增加新特性時纔會更新這個版本號
5.5 服役新數據節點
5.5.1 需求
隨着公司業務的增長,數據量越來越大,原有的數據節點的容量已經不能滿足存儲數據的需求,需要在原有集羣基礎上動態添加新的數據節點
5.5.2 環境準備
-
克隆一臺虛擬機(master -> slave3),並啓動
從 master 上克隆可節省文件同步的時間,否則需要重新安裝、配置 JDK、Hadoop
-
修改 ip 地址爲 192.168.27.104
-
修改 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
-
修改主機名
hostnamectl set-hostname slave3
-
建立 master、slave1、slave2 和 slave3 之間的免密
刪除 slave3 下的 .ssh,重新生成公鑰進行同步
以上五步可參考 Hadoop集羣搭建-3
-
刪除原來 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 服役新節點具體步驟
-
在 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
-
在 Namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts 屬性
<property> <name>dfs.hosts</name> <value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts</value> </property>
-
刷新 Namenode
[root@master hadoop]# hdfs dfsadmin -refreshNodes Refresh nodes successful
新增了 master、slave3 的 Datanode 節點
-
更新 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
-
在 Namenode 的 slaves 文件中增加新主機名稱
增加 master、slave3 不需要分發
master slave1 slave2 slave3
-
單獨命令啓動新的數據節點和節點管理器
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 進程已啓動
-
在 web 瀏覽器上檢查是否 ok
目前只啓動了 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
-
在 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
-
在 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>
-
刷新 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
-
檢查 web 瀏覽器,退役節點的狀態 無(退役中),說明數據節點正在複製塊到其他節點
-
等待退役節點狀態爲 decommissioned(所有塊已經複製完成),停止該節點及節點資源管理器
此時,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
-
從 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
-
從 Namenode 的 slave 文件中刪除退役節點 hadoop105
master slave1 slave2 slave3
-
如果數據不均衡,可以用命令實現集羣的再平衡
[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>