項目地址: disk-balancer-hadoop2.6
關於磁盤數據平衡
當現有HDFS遇到存儲空間瓶頸時,我們可以通過往DN上加磁盤來緩解,而由於DN上的原有磁盤數據快滿,新加的磁盤又是空的,就導致磁盤間的數據不平衡。在Hadoop3.0以下版本里,並沒有提供disk-balancer工具,雖然我們可以通過設置新增數據的磁盤選擇策略(參數 dfs.datanode.fsdataset.volume.choosing.policy
)爲 org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
,這樣新來數據會盡量往空閒磁盤上寫,但是它需要一個長時間的過程才能達到平衡。而不平衡帶來的影響就是,數據讀取會比較集中在已滿的磁盤上,導致這些磁盤超負荷工作,同時也影響跑任務
使用方式
編譯好jar之後,拷貝到需要做數據平衡的DN上,停掉該DN然後執行下面命令
hadoop jar /path/to/volume-balancer-<version>.jar org.apache.hadoop.hdfs.server.datanode.VolumeBalancerNew [-threshold=0.1] [-concurrency=1] [-dirs=128]
當數據少的磁盤的可用比與整個DN的磁盤可用比達到設置的閾值範圍時,或當遷移的子目錄數達到 volumes * dirs * 256
時(volumes是DN掛載的HDFS磁盤個數),數據平衡會自動停止
當數據平衡結束,重新啓動DN即可
對於CDH
對於CDH而言,HDFS的配置分爲靜態和動態兩部分,靜態的位於 /etc/conf/hadoop
,動態的位於 /{Cloudera_Install_Path}/run/cloudera-scm-agent/process/*-hdfs-DATANODE
下,而磁盤配置(參數 dfs.datanode.data.dir
)的文件則位於動態目錄下,所以執行腳本的時候需要加載該目錄下的 hdfs-site.xml
或 hdfs-site-refreshable.xml
,對於CDH,可見 使用src/main/scripts 下的幫助腳本
參數
threshold
默認值爲 0.1,設置磁盤平衡的閾值,該值越小,磁盤越平衡,花的時間越長
concurrency
默認值爲 1,設置數據平衡腳本的並行度,在需要平衡的磁盤比較多時,可適當調大這個值,但並不是越大越好,磁盤數據吞吐是有閾值的,建議值爲2~5
dirs
默認值爲 128,設置最大轉移的子目錄數,從Hadoop2.6開始HDFS採用兩級子目錄的結構,單個磁盤上最大文件夾個數爲 256 * 256,這個值可以設置總的最大轉移子目錄數爲 volumes * dirs * 256
關於項目
此項目fork自bperroud的 volumn-balancer,由於原項目只提供了Hadoop2.6以下版本的DN磁盤平衡 VolumeBalancer
,在此基礎上我增加了Hadoop2.6及以上版本的磁盤平衡 VolumeBalancerNew
,目前在生產環境使用良好,原磁盤使用率92%,平衡後69%,如下
歡迎所有人提交PR貢獻您的想法、完善文檔、代碼、補丁、bug或其他特性,助力項目更加完善可靠!