天天看點

大資料叢集節點磁盤負載不均衡怎麼辦?

作者:燈惉

“大資料叢集節點磁盤負載不均衡”的問題,相信大資料叢集管理者并不陌生, 本片文章,我們就簡單分享下,如何應對上述問題。

問題現象

大資料叢集使用一段時間後,有時我們會發現大資料叢集中某些節點的多塊磁盤的負載不均衡,比如某些磁盤使用率達到了百分之七八十,有的才百分之二三十。

問題原因

造成以上問題的背景和原因,很多時候是因為,我們在使用過程中,發現某些磁盤損壞後,使用新磁盤進行了替換,或者當發現HDFS容量不夠需要擴充空間時,由運維管理人員陸陸續續為 datanode 節點增加了多塊磁盤,并将這些磁盤挂載到了不同目錄比如 /mnt/disk1, /mnt/disk2;此後由大資料系統管理人員配置 HDFS 使用了這些新的磁盤上的目錄 (比如配置 dfs.datanode.data.dir=/mnt/disk1/dfs/data,/mnt/disk2/dfs/data,/mnt/disk3/dfs/data),并重新開機了 hdfs 服務使配置生效。

但是hdfs經過上述配置更改并重新開機生效之後,隻有新增加的HDFS檔案才會存儲在新增加的目錄下,已經存在的HDFS曆史檔案,其對應的底層資料是不會從原有目錄移動到新增目錄的。

即使使用了指令 hdfs balancer 來在叢集内重新分布 HDFS 檔案,由于該指令隻會在不同host之間移動資料,也就是主要做的是 host 節點級别的負載均衡,上述單節點中多磁盤之間的負載不均衡問題,也不會由太大緩解。

注意:在 CDH 中,上述節點級别的負載均衡,除了在背景使用指令觸發執行,也可以通過如下頁面觸發執行:

大資料叢集節點磁盤負載不均衡怎麼辦?

為達到上述單節點中多磁盤之間的負載均衡,我們需要在單節點的多個磁盤目錄之間,根據其使用率的差異,在磁盤目錄之間移動資料。

該功能可以使用 Hdfs 的 hdfs diskbalancer 來實作, 該工具是 hadoop 3.0 通過 HDFS-1312 引入的新功能。

技術背景-HDFS-1312

hdfs diskbalancer 工具是 hadoop 3.0 通過 HDFS-1312 引入的新功能:

大資料叢集節點磁盤負載不均衡怎麼辦?

image

幸運的是,在 CDH 平台中,即使我們使用的不是 hadoop 3.x, 在某些 hadoop 2.x 系列中,由于 Cloudera cherry pick 了上述功能,我們仍然可以使用上述指令實作磁盤級别的負載均衡:

大資料叢集節點磁盤負載不均衡怎麼辦?

image

問題解決

在 CDH 6.3 及以前的版本中,上述但節點磁盤級别的負載均衡工具 hdfs diskbalancer, 并沒有像節點級别的負載均衡工具 hdfs balancer 一樣內建到 web 頁面中,是以我們隻能在背景通過指令來觸發執行。

具體來講,需要安裝一下步驟進行操作:

  1. 確定hdfs-site.xml中的配置 dfs.disk.balancer.enabled=true
  2. 使用指令生成 balancer plan 檔案:hdfs diskbalancer -plan target-node //target-node是需要均衡的節點,該指令會生成一個*.plan.json的檔案
  3. 使用指令執行balance plan檔案,進行均衡操作:hdfs diskbalancer -execute target-node.plan.json
  4. 查詢均衡操作的完成狀态:hdfs diskbalancer -query target-node // DONE 的時候表示已經執行完畢

注意:

  • CDH6.3等版本中配置dfs.disk.balancer.enabled,需要在hdfs-site.xml的進階配置代碼段中配置:
  • 如果 dfs.disk.balancer.enabled=false,執行相關指令時會報以下錯誤:
  • 如果節點的磁盤負載差異不大,執行指令時會報資訊“DiskBalancing not needed for node:”:
  • 由于磁盤均衡過程中,磁盤IO、網絡IO占用都會比較高,建議盡量在叢集負載不高時進行;
  • 可以通過指令行參數 -bandwidth, 或配置檔案參數 dfs.disk.balancer.max.disk.throughputInMBperSe 控制 diskbalancer 的均衡速度門檻值//參數 dfs.datanode.balance.bandwidthPerSec 控制的是節點級别 balancer 的均衡速度門檻值;
  • 可同時配置磁盤的選擇政策 dfs.datanode.fsdataset.volume.choosing.policy(預設 rg.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy,可選 org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy);
  • 完整指令行參數和配置檔案參數,如下:
大資料叢集節點磁盤負載不均衡怎麼辦?

image

大資料叢集節點磁盤負載不均衡怎麼辦?

image

  • 相關指令示例如下:
  • hdfs diskbalancer -plan node1.mycluster.com
  • hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
  • hdfs diskbalancer -query nodename.mycluster.com
  • hdfs diskbalancer -cancel planID -node nodename
  • hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]
  • hdfs diskbalancer -fs http://namenode.uri -report -top topnum

繼續閱讀