概覽
Diskbalancer 是一個命令行工具,可以在某個datanode的所有磁盤上均勻地分布數據。這個工具不同於負責整個集群數據平衡的 Balancer 。由於以下幾個原因,數據可能在節點上的磁盤之間不均勻地傳播。這可能是由於大量的寫和刪除操作或者磁盤替換造成的。這個工具對給定的datanode進行操作,並將塊從一個磁盤移動到另一個磁盤。
架構
磁盤平衡器通過創建一個計划來運行,然后在 datanode 上執行該計划。計划是一組描述兩個磁盤之間應該移動多少數據的語句。一個計划由多個步驟組成。移動計划包括源磁盤、目標磁盤和要移動的字節數。磁盤平衡器不會干擾其他進程,因為它會限制每秒鍾復制多少數據。請注意,在群集上默認情況下沒有啟用磁盤平衡器。要啟用 diskbalancer dfs.disk.balancer.enabled 必須在 hdfs-site.xml 中設置為 true。
命令
下面幾節討論磁盤平衡器支持哪些命令以及如何使用它們。
計划
可以通過運行 plan 命令在給定的datanode上運行
hdfs diskbalancer -plan node1.mycluster.com
該命令接受通用選項Generic Options。
plan 命令還具有一組參數,允許用戶控制計划的輸出和執行。
命令選項 | 描述 |
---|---|
-out | 允許用戶控制計划文件的輸出位置 |
-bandwidth | 由於 datanode 可能正在運行其他作業,所以 diskbalancer 限制每秒移動的數據量。此參數允許用戶設置要使用的最大帶寬。 |
-thresholdPercentage | 由於我們面向的是datanode 的snap-shot進行操作,因此移動操作有容忍百分比來宣布成功。如果用戶指定10% 並且移動操作大小為20gb,如果我們可以移動18gb,那么該操作被認為是成功的。這是為了實時適應datanode中的變化。可選參數,如果未指定則使用默認值 |
-maxerror | maxerror允許用戶指定在終止移動步驟之前必須有多少塊復制操作失敗。同樣,這是個可選參數,如果沒有指定,則使用系統默認值 |
- v |
詳細模式,指定此參數將強制 plan 命令在 stdout 上打印計划的摘要 |
- f |
- 指定要使用的名稱。如果沒有指定默認配置使用 |
plan 命令有兩個輸出文件, <nodename>.before.json
(用來記錄執行命令前的狀態)、<nodename>.plan.json
。
執行
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
這通過從計划文件讀取 datanode 的地址來執行計划。
查詢
Query 命令從datanode獲取磁盤平衡器的當前狀態。
hdfs diskbalancer -query nodename.mycluster.com
命令選項 | 描述 |
---|---|
- v |
詳細模式,打印移動狀態 |
取消
取消命令取消正在運行的計划。
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
或
hdfs diskbalancer -cancel planID -node nodename
可以使用 query 命令從 datanode 讀取計划 ID。
報告
Report 命令提供指定節點的詳細報告,這些節點將從運行磁盤平衡器中受益。可以通過主機文件或以逗號分隔的節點列表指定節點。
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]
或
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
設置
有一組磁盤均衡器設置可以通過 hdfs-site. xml 控制
環境 | 描述 |
---|---|
dfs.disk.balancer.enabled |
該參數控制集群是否啟用diskbalancer。如果不啟用,任何execute命令都會被datanode拒絕。默認值為false。 |
dfs.disk.balancer.max.disk.throughputInMBperSec |
這控制磁盤平衡器在復制數據時消耗的最大磁盤帶寬。如果指定的值是10MB,那么平均來說 diskbalancer 只會復制10MB/s。默認值為10MB/s |
dfs.disk.balancer.max.disk.errors |
設置兩個磁盤之間的特定移動在放棄之前可以忽略的最大錯誤數的值。例如,如果一個計划要在3對磁盤之間進行復制,而第一個磁盤集遇到5個以上的錯誤,那么我們就放棄第一個復制並開始計划中的第二個復制。最大錯誤的默認值設置為5 |
dfs.disk.balancer.block.tolerance.percent |
容差百分比指定我們何時達到任何復制步驟所需的足夠好的值。例如,如果指定10% ,那么接近目標值的10% 就足夠了 |
dfs.disk.balancer.plan.threshold.percent |
計划中的卷數據密度的百分比閾值。如果一個節點的卷數據密度的絕對值超出了閾值,則意味着與磁盤對應的卷應該在計划中進行平衡。默認值是10 |