Diskbalancer 是一個命令列工具,用於將資料均勻地分佈在資料節點的所有磁碟上。此工具不同於 Balancer,後者負責叢集範圍的資料平衡。由於多種原因,資料在節點上的磁碟之間可能分佈不均。這可能是由於大量的寫入和刪除,或由於磁碟更換。此工具針對給定的資料節點進行操作,並將區塊從一個磁碟移動到另一個磁碟。
Disk Balancer 透過建立計畫並繼續在資料節點上執行該計畫來運作。計畫是一組陳述式,描述了多少資料應該在兩個磁碟之間移動。計畫由多個移動步驟組成。移動步驟具有來源磁碟、目標磁碟和要移動的位元組數。計畫可以針對作業中的資料節點執行。Disk balancer 不應干擾其他程序,因為它會限制每秒複製多少資料。請注意,Disk balancer 在叢集上預設啟用。
以下各節討論 Disk balancer 支援哪些指令以及如何使用它們。
計畫指令可透過執行以下指令針對指定的資料節點執行
hdfs diskbalancer -plan node1.mycluster.com
該指令接受 一般選項。
計畫指令也有一組參數,允許使用者控制計畫的輸出和執行。
COMMAND_OPTION | 說明 |
---|---|
-out |
允許使用者控制計畫檔案的輸出位置。 |
-bandwidth |
由於資料節點正在運作,而且可能正在執行其他工作,因此 diskbalancer 會限制每秒移動的資料量。此參數允許使用者設定要使用的最大頻寬。如果未指定此參數,則不需要設定,因為 diskBalancer 會使用預設頻寬。 |
-thresholdPercentage |
由於我們針對資料節點的快照進行操作,因此移動作業有容許百分比來宣告成功。如果使用者指定 10%,而移動作業的大小為 20GB,如果我們可以移動 18GB,則該作業會被視為成功。這是為了適應資料節點在實際時間中的變更。如果未指定此參數,則不需要,且會使用預設值。 |
-maxerror |
最大錯誤允許使用者指定在中止移動步驟之前,必須失敗的區塊複製作業數量。再次強調,這不是必要的參數,如果未指定,則會使用系統預設值。 |
-v |
詳細模式,指定此參數會強制計畫指令在 stdout 上列印計畫摘要。 |
-fs |
- 指定要使用的名稱節點。如果未指定,則會使用設定檔中的預設值。 |
計畫指令會寫入兩個輸出檔案。它們是 <nodename>.before.json
,它擷取 diskbalancer 執行前的叢集狀態,以及 <nodename>.plan.json
。
執行指令會取得計畫指令,並針對產生計畫的資料節點執行該指令。
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
這會透過從計畫檔案中讀取資料節點的位址來執行計畫。當 DiskBalancer 執行計畫時,這是一個可能需要很長時間的非同步程序的開端。因此,查詢指令有助於取得執行指令的目前狀態。
COMMAND_OPTION | 說明 |
---|---|
-skipDateCheck |
略過日期檢查,並強制執行計畫。 |
查詢指令會從資料節點取得 diskbalancer 的目前狀態。
hdfs diskbalancer -query nodename.mycluster.com
COMMAND_OPTION | 說明 |
---|---|
-v |
詳細模式,列印個別移動的狀態 |
取消指令會取消正在執行的計畫。重新啟動資料節點的效果與取消指令相同,因為資料節點上的計畫資訊是暫時的。
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
或
hdfs diskbalancer -cancel planID -node nodename
計畫 ID 可使用查詢指令從資料節點讀取。
報告指令提供特定節點或將從執行磁碟平衡器中受益的熱門節點的詳細報告。節點可透過主機檔案或逗號分隔的節點清單指定。
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<資料節點 ID|IP|主機名稱>,...]
或
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
有一組 diskbalancer 設定可透過 hdfs-site.xml 控制
設定 | 說明 |
---|---|
dfs.disk.balancer.enabled |
此參數控制是否為叢集啟用 diskbalancer。如果未啟用,資料節點將拒絕任何執行指令。預設值為 true。 |
dfs.disk.balancer.max.disk.throughputInMBperSec |
此設定控制 diskbalancer 在複製資料時消耗的最大磁碟頻寬。如果指定 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。 |
dfs.disk.balancer.plan.valid.interval |
磁碟平衡器計畫的有效時間上限。支援下列字尾 (不分大小寫):ms (毫秒)、s (秒)、m (分鐘)、h (小時)、d (天) 來指定時間 (例如 2s、2m、1h 等)。如果未指定字尾,則假設為毫秒。預設值為 1d |
磁碟平衡器會產生兩個輸出檔案。nodename.before.json 包含我們從名稱節點讀取的叢集狀態。此檔案包含有關資料節點和磁碟區的詳細資訊。
如果您計畫將此檔案張貼到 Apache JIRA,您可能想要替換您的主機名稱和磁碟區路徑,因為它可能會洩漏您的個人資訊。
您也可以修剪此檔案,僅針對您想要在 JIRA 中報告的節點。
nodename.plan.json 包含特定節點的計畫。此計畫檔案包含一系列步驟。步驟會在資料節點內執行為一系列移動作業。
若要比較節點前後的狀態,您可以重新執行計畫指令,並比較新的 nodename.before.json 與舊的 before.json,或對節點執行報告指令。
若要查看正在執行計畫的進度,請使用選項 -v 執行查詢指令。這會列印出一組步驟,每個步驟都代表從一個磁碟到另一個磁碟的移動作業。
移動速度受到所指定頻寬的限制。頻寬的預設值設定為 10 MB/秒。如果您使用 -v 選項執行查詢,您會看到下列值。
"sourcePath" : "/data/disk2/hdfs/dn", "destPath" : "/data/disk3/hdfs/dn", "workItem" : "startTime" : 1466575335493, "secondsElapsed" : 16486, "bytesToCopy" : 181242049353, "bytesCopied" : 172655116288, "errorCount" : 0, "errMsg" : null, "blocksCopied" : 1287, "maxDiskErrors" : 5, "tolerancePercent" : 10, "bandwidth" : 10
來源路徑 - 是我們複製的來源磁碟區。
目標路徑 - 是我們複製的目標磁碟區。
開始時間 - 是以毫秒為單位的目前時間。
經過秒數 - 是每當我們更新統計資料時更新。這可能會比實際時間慢。
要複製的位元組 - 是我們應該複製的位元組數。我們會複製正負某個百分比。因此,您經常會看到 bytesCopied - 是小於要複製的位元組的值。在預設情況下,達到要移動位元組的 10% 內被視為足夠好。
已複製的位元組 - 是我們從來源磁碟實際移動到目標磁碟的位元組數。
錯誤計數 - 每當我們遇到錯誤時,我們會增加錯誤計數。只要錯誤計數小於最大錯誤計數(預設值為 5),我們就會嘗試完成此移動。如果我們達到最大錯誤計數,我們會放棄此目前的步驟,並執行計畫中的下一個步驟。
錯誤訊息 - 目前為單一字串,會報告最後一個錯誤訊息。較早的訊息應會在資料節點日誌中。
已複製區塊 - 已複製區塊的數量。
最大磁碟錯誤 - 用於此移動步驟的組態。目前會報告預設組態值,因為用於控制每個步驟這些值的使用者介面尚未就緒。這是未來的工作項目。此值會使用計畫命令中指定的預設值或命令列值。
容許誤差百分比 - 這表示在移動資料時我們可以容許的誤差範圍。在繁忙的叢集中,這允許管理員說,計算計畫,但我知道這個節點正在使用中,因此如果磁碟平衡器可以達到要複製的位元組的 +/- 10%,那就可以了。
頻寬 - 這是磁碟平衡器使用的最大總計來源磁碟頻寬。在移動區塊後,磁碟平衡器會計算使用指定的頻寬移動該區塊應花費多少秒。如果實際移動花費的時間比預期短,則磁碟平衡器會休眠該期間。請注意,目前所有移動都是由單一執行緒依序執行。