在生產環境中,叢集節點磁碟大小不同,其使用率也會不同,HDFS雖有均衡策略,但也會有資料不平衡的情況,有些節點磁碟就會被打滿,然後這個節點就不健康了(Unhealthy Nodes),Yarn的磁碟閾值檢查(yarn.nodemanager.disk-health-checker.min-healthy-disks),預設是90%,超過這個值就會不健康,叢集有個節點不健康,就會導致任務執行緩慢,之後任務再擠壓,Yarn資源被集中佔用,最終影響上層服務。
問題
-
磁碟空間不足,待擴容,可動態增刪磁碟
-
yarn資源不足,待優化,可動態調整
本篇內容只新增新磁碟,yarn資源優化我們在另一篇文章再專門詳解。
官方說明
DataNode Hot Swap Drive
Datanode supports hot swappable drives. The user can add or replace HDFS data volumes without shutting down the DataNode. The following briefly describes the typical hot swapping drive procedure:
If there are new storage directories, the user should format them and mount them appropriately.
The user updates the DataNode configuration
dfs.datanode.data.dir
to reflect the data volume directories that will be actively in use.The user runs
dfsadmin -reconfig datanode HOST:PORT start
to start the reconfiguration process. The user can usedfsadmin -reconfig datanode HOST:PORT status
to query the running status of the reconfiguration task.Once the reconfiguration task has completed, the user can safely
umount
the removed data volume directories and physically remove the disks.
經過谷歌翻譯如下:
DataNode 熱插拔驅動器
Datanode 支援熱插拔驅動器。使用者可以在不關閉 DataNode 的情況下新增或替換 HDFS 資料卷。下面簡要介紹典型的熱插拔驅動器過程:
如果有新的儲存目錄,使用者應該格式化它們並適當地掛載它們。
使用者更新 DataNode 配置
dfs.datanode.data.dir
以反映將被積極使用的資料卷目錄。使用者執行
dfsadmin -reconfig datanode HOST:PORT start
來啟動重新配置過程。使用者可以使用dfsadmin -reconfig datanode HOST:PORT status
查詢重配置任務的執行狀態。重新配置任務完成後,使用者可以安全地解除安裝已移除的資料卷目錄並物理移除磁碟。
我們先說新增新的磁碟,大意就是不需要重啟任何節點,在需要新增磁碟的節點上,新增好磁碟,這個需要運維操作,就是掛載一個新目錄,文件中是說要配置DataNode的目錄,這裡我們建議加上NameNode的目錄dfs.namenode.name.dir
,然後再執行一個使配置生效的命令,最後檢視配置狀態。
具體操作
這裡假設已有叢集,需要加磁碟的節點為node2。運維也已經幫我們掛載好磁碟,新磁碟目錄為/data2
。
第一步:新增目錄
在node2上新增新目錄,資料目錄和後設資料目錄
mkdir -p /data2/soft/hadoop/tmp/dfs/data
mkdir -p /data2/soft/hadoop/tmp/dfs/name
第二步:修改配置
修改節點node2的配置檔案hdfs-site.xml,主要兩個屬性
修改前
<!--指定hdfs中namenode的儲存位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/soft/hadoop/tmp/dfs/name</value>
</property>
<!--指定hdfs中datanode的儲存位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/soft/hadoop/tmp/dfs/data</value>
</property>
修改後
<!--指定hdfs中namenode的儲存位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/soft/hadoop/tmp/dfs/name,/data2/soft/hadoop/tmp/dfs/name</value>
</property>
<!--指定hdfs中datanode的儲存位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/soft/hadoop/tmp/dfs/data,/data2/soft/hadoop/tmp/dfs/data</value>
</property>
第三步:使配置生效
重新配置DataNode的配置,使配置生效。
hdfs dfsadmin -reconfig datanode node2:50020 start
hdfs dfsadmin -reconfig datanode node2:50020 status
第四步:平衡資料
HDFS資料本身並不總是均勻的放置在DataNode中,在新增新磁碟後,我們需要重新平衡下資料,HDFS為我們提供了一個工具,可以分析資料塊放的位置和跨 DataNode 重新平衡資料:balancer
hdfs balancer [-threshold <threshold>]:磁碟容量百分百,判斷叢集是否平衡的目標引數,每一個 datanode 儲存使用率和叢集總儲存使用率的差值都應該小於這個閥值,越小越平衡,預設10,越大平衡越快。 [-policy <policy>]:datanode(預設):如果每個資料節點都是平衡的,則叢集是平衡的。blockpool:如果每個資料節點中的每個塊池都是平衡的,則叢集是平衡的。 [-exclude [-f <hosts-file> | <comma-separated list of hosts>]]:將指定的資料節點排除在平衡器的平衡之外。 [-include [-f <hosts-file> | <comma-separated list of hosts>]]:僅包括要由平衡器平衡的指定資料節點。 [-idleiterations <idleiterations>]:rebalanecing server啟動的執行緒數,預設5。
平衡前操作
在平衡時受頻寬影響,每個資料節點每秒使用的最大位元組數是有限的,所以我們先臨時設定這個值,此值會覆蓋hdfs-site.xml中dfs.datanode.balance.bandwidthPerSec
的值,預設是1M,本操作命令不會持久,命令如下:
hdfs dfsadmin -setBalancerBandwidth 104857600
其他值:1024*1024=1M(1048576),52428800=50M,104857600=100M
開始平衡
本次執行平衡命令,磁碟平衡目標數為20 nohup hdfs balancer -threshold 20 > balancer.log &
其他平衡命令
nohup hdfs balancer > balancer.log &
平衡指定節點,磁碟平衡目標數為10 nohup hdfs balancer -include node7,node9,node10,node11 -threshold 10 > balancer.log &
平衡指定節點,磁碟平衡目標數,啟動執行緒數為10 nohup hdfs balancer -include node7,node9,node10,node11 -threshold 10 -idleiterations 10 > balancer.log &
注(可選):一般在平衡時,可以先停止儲存比較高的節點上的NodeManager,這樣在該節點上就不會受本地NodeManager落資料到本地,使得本地儲存迅速增加的影響。
yarn-daemon.sh stop nodemanager