當您的集群因大量的寫入和刪除,或者由于磁盤更換和擴容等操作,導致數(shù)據(jù)在節(jié)點上的磁盤之間分布不均勻,引起HDFS并發(fā)讀寫性能的下降等問題時,可通過HDFS Diskbalancer將數(shù)據(jù)均勻地分布在DataNode的所有磁盤上。本文為您介紹HDFS DiskBalancer的使用方法以及主要調(diào)優(yōu)參數(shù)。

背景信息

HDFS Diskbalancer是Hadoop 3.x提供的一個命令行工具,可以將數(shù)據(jù)均勻地分布在DataNode的所有磁盤上。不同于HDFS Balancer,HDFS Balancer負責集群范圍內(nèi)的數(shù)據(jù)平衡,HDFS Diskbalancer工具是對給定的DataNode進行操作,將塊從一個磁盤移動到另一個磁盤。

HDFS Diskbalancer的操作方式是創(chuàng)建一個計劃(plan),然后在DataNode執(zhí)行該計劃。計劃是描述兩個磁盤之間應該移動多少數(shù)據(jù)的一組語句。一個計劃是由多個步驟組成的。移動步驟有源磁盤、目標磁盤和要移動的字節(jié)數(shù)。計劃可以針對操作數(shù)據(jù)節(jié)點執(zhí)行。磁盤平衡器通過限制每秒復制的數(shù)據(jù)量防止干擾其他進程。

使用HDFS DiskBalancer

HDFS DiskBalancer命令語句如下。
hdfs diskbalancer -help <command>.
    --help <arg> valid commands are plan | execute | query | cancel |
                   report

plan

通過指定一個DataNode執(zhí)行DiskBalancer。
hdfs diskbalancer -plan <hostname> [options]
示例:
hdfs diskbalancer -plan core-1-1.c-xxxxxxxxxxx
命令選項 描述
-bandwidth <arg> DiskBalancer可使用的最大磁盤帶寬(MB/s),為整數(shù)。例如10 MB/s。
-maxerror <arg> 描述在一對磁盤之間進行復制時可容忍的錯誤數(shù)。
-out <arg> 要寫入輸出的文件的本地路徑,如果未指定,將使用默認值。
-thresholdPercentage <arg> 磁盤平衡器開始工作前允許的數(shù)據(jù)傾斜百分比。例如,如果一個2盤節(jié)點上的總數(shù)據(jù)為100 GB,那么磁盤均衡器計算每個磁盤上的期望值為50 GB。如果容差為10%,則單個磁盤上的數(shù)據(jù)需要大于60 GB(50 GB + 10%容差值),DiskBalancer才能開始工作。
-v 詳細模式,指定此參數(shù)將強制plan命令在標準輸出上打印計劃的摘要。

execute

通過指定一個plan命令生成的planfile,執(zhí)行DiskBalancer。
hdfs diskbalancer -execute <planfile>
示例:
hdfs diskbalancer -execute /system/diskbalancer/core-1-1.c-xxxxxxxxxxx.plan.json
命令選項 描述
-skipDateCheck 跳過日期檢查并強制執(zhí)行計劃。

query

查詢指定DataNode關于磁盤均衡器執(zhí)行的當前狀態(tài)。
hdfs diskbalancer -query <hostname>  [options]
示例:
hdfs diskbalancer -query core-1-1.c-xxxxxxxxxxx
命令選項 描述
-v 打印正在節(jié)點上執(zhí)行的計劃的詳細信息。

cancel

取消正在運行的計劃,與重新啟動DataNode的效果相同。
hdfs diskbalancer -cancel <planFile> | -cancel <planID> -node <hostname>
示例:
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
或者
hdfs diskbalancer -cancel planID -node nodename
說明 planID可以通過query命令從DataNode中讀取。
命令選項 描述
-node <arg> 取消正在執(zhí)行的使用planID和主機名運行的計劃。

report

report命令提供指定節(jié)點或將從運行磁盤均衡器中受益的Top節(jié)點的詳細報告。節(jié)點可以通過一個主機列表文件或以逗號分隔的節(jié)點列表指定。
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]
或者
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
命令選項 描述
-node <arg> DataNode地址,可以為DataNode ID、IP或者hostname。
-top <arg> 指定要列出的數(shù)據(jù)不平衡的節(jié)點數(shù)量。

HDFS DiskBalancer調(diào)優(yōu)參數(shù)

當需要對DiskBalancer參數(shù)進行調(diào)整時,您可以在E-MapReduce控制臺的HDFS服務頁面,選擇配置 > hdfs-site.xml,新增或調(diào)整以下配置。
參數(shù) 描述
dfs.disk.balancer.enabled 是否開啟HDFS DiskBalancer特性。默認為true。
dfs.disk.balancer.max.disk.throughputInMBperSec 執(zhí)行DiskBalancer時可使用的最大磁盤帶寬。單位為MB/s,默認為10。
dfs.disk.balancer.max.disk.errors 設置能夠容忍的在指定的移動過程中出現(xiàn)的最大錯誤次數(shù),超過此閾值則失敗。默認為5。
dfs.disk.balancer.plan.valid.interval DiskBalancer計劃的最長有效時間。默認為1d。
dfs.disk.balancer.block.tolerance.percent 設置磁盤之間進行數(shù)據(jù)均衡操作時,各個磁盤的數(shù)據(jù)存儲量與理想狀態(tài)之間的差異閾值。取值范圍[1-100],默認為10。例如,各個磁盤的理想數(shù)據(jù)存儲量為100 GB,此參數(shù)設置為10。那么,當目標磁盤的數(shù)據(jù)存儲量達到90 GB時,則認為該磁盤的存儲狀態(tài)就已經(jīng)達到預期。
dfs.disk.balancer.plan.threshold.percent 設置在磁盤數(shù)據(jù)均衡中可容忍的兩磁盤之間的數(shù)據(jù)密度域值差,取值范圍[1-100],默認為10。如果任意兩個磁盤數(shù)據(jù)密度差值的絕對值超過了閾值,則說明需要對該的磁盤進行數(shù)據(jù)均衡。例如,如果一個2盤節(jié)點上的總數(shù)據(jù)為100 GB,那么磁盤均衡器計算每個磁盤上的期望值為50 GB。如果容差為10%,則單個磁盤上的數(shù)據(jù)需要大于60 GB(50 GB + 10%容差值),DiskBalancer才能開始工作。