當您的集群因大量的寫入和刪除,或者由于磁盤更換和擴容等操作,導致數(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服務頁面,選擇
,新增或調(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才能開始工作。 |