HDFS集群數據不均衡處理


一、概述

公司使用是自己搭建的hadoop集群,版本2.7.3,最近發現出現了hdfs數據存儲不均衡的現象,其中有一個datanode使用了65%,而有一個只使用了20%。hadoop集群使用的時間長了會出現這種數據不均衡的問題,當然hadoop提供了解決方案,就是使用balancer,默認進行的是datanode級別的數據均衡,但是2.X版本還不支持datanode內的磁盤之間數據均衡,hadoop在3.0以后的版本里面提供了相關的支持,參考https://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html

 

二、問題解決

1、datanode之間出現了數據不平衡的現象

可以執行hadoop提供的balancer,來進行datanode之間數據balance,默認hdfs的balance帶寬是1M/s,這個可以通過參數來進行調整dfs.datanode.balance.bandwidthPerSec, dfs.balance.bandwidthPerSec

HDFS平衡器檢測集群中使用過度或者使用不足的DataNode,並在這些DataNode之間移動數據塊來保證負載均衡。如果不對平衡操作進行帶寬限制,那么它會很快就會搶占所有的網絡資源,不會為Mapreduce作業或者數據輸入預留資源。參數dfs.balance.bandwidthPerSec定義了每個DataNode平衡操作所允許的最大使用帶寬,這個值的單位是byte,這是很不直觀的,因為網絡帶寬一般都是用bit來描述的。因此,在設置的時候,要先計算好。DataNode使用這個參數來控制網絡帶寬的使用,但不幸的是,這個參數在守護進程啟動的時候就讀入,導致管理員沒辦法在平衡運行時來修改這個值,如果需要調整就要重啟集群

# hdfs balancer --help
Usage: hdfs balancer
    [-policy <policy>]    the balancing policy: datanode or blockpool
    [-threshold <threshold>]    Percentage of disk capacity
    [-exclude [-f <hosts-file> | <comma-separated list of hosts>]]    Excludes the specified datanodes.
    [-include [-f <hosts-file> | <comma-separated list of hosts>]]    Includes only the specified datanodes.
    [-idleiterations <idleiterations>]    Number of consecutive idle iterations (-1 for Infinite) before exit.

Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|resourcemanager:port>    specify a ResourceManager
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]

 

#設置帶寬,默認是1048576(1M/s),默認單位是字節
hdfs dfsadmin -setBalanacerBandwidth 1048576
#允許的disk 數據差距,是一個百分數,例如我寫的是5,也就是容忍datanode數據的差距是5%
hdfs  balancer  -threshold  5

#選擇需要進行數據balance的datanode
hdfs balancer  -include   spark-worker1,sparkworker2

 

2、datanode內磁盤之間的數據不均衡

datanode內的磁盤是指在一個datanode上掛載多個磁盤,在hdfs-site.xml文件里面配置多個目錄:

   <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/data/hadoop-2.7.3/hdfs/data,/data1/hdfs1</value>
    </property>

datanode內部多個磁盤的數據分布不均衡,是指某個磁盤的使用是80%,而另外一塊磁盤只使用了30%,這種情況下balancer就不能處理數據平衡了。可以使用diskbalancer來平衡磁盤之間的數據。

intra-datanode就是用來處理這累問題的,但是在hadoop3.0才開始支持,所以需要升級hadoop的版本,一般現有集群升級可能會造成一些麻煩,淡然如果能升級的話建議直接升級,因為新版本的hadoop性能有很大的提升,並且與2.x版本有很多的差異。當然不升級也有方法解決,dfs.datanode.data.dir的多個目錄之間是采用的輪訓的方法寫入的,可以在使用率低的磁盤上創建多個同級的目錄,增加數據寫入的概率

   <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/data/hdfs/data,/data1/hdfs1,/data1/hdfs2</value>
    </property>

 

升級到3.0后,可以直接就會在hdfs的命令參數里面找到diskbalancer

diskbalancer有三個階段:discover、plan、execute

Discover階段:

計算各個DataNode磁盤使用情況,然后得到一個需要進行數據平衡的磁盤列表,會使用VolumeData Density(磁盤使用密度)作為評判標准,這個標准會以節點總使用率作為比較值。比如,如果一個DataNode  ,總使用率是75%,也就是0.75. 其中A盤0.5,那么A盤的密度值就=0.75-0.5=0.25;同理如果超出的話,則密度值將會為負數。於是我們可以用VolumeData Density絕對值來判斷此節點內磁盤間數據平衡情況,如果總的覺得值和越大,說明數據越不平衡

Plan階段:

拿到上一階段的匯報結果數據之后,將會進行執行計划的生成.Plan並不是一個最小的執行單元,它的內部由各個Step組成.Step中會指定好源,目標磁盤.這里的磁盤對象是一層經過包裝的對象:DiskBalancerVolume,並不是原來的FsVolume.這里順便提一下DiskBalancer中對磁盤節點等概念的轉化:

  》DiskBalancerCluster.通過此對象可以,讀取到集群中的節點信息,這里的節點信息以DiskBalancerDataNode的方式所呈現.
  》DiskBalancerDataNode.此對象代表的是一個包裝好后的DataNode.
  》DiskBalancerVolume和DiskBalancerVolumeSet.DataNode磁盤對象以及磁盤對象集合.DiskBalancerVolumeSet內的磁盤存儲目錄類型需要是同種StorageType.

Execute階段:

所有執行計划生成以后,就到了執行階段。這些計划會被提交到各自DataNode上,然后在DiskBalancer類中執行。然后DiskBalancer有專門的類DiskBalancerMover來做數據平衡工作。在磁盤間數據平衡的過程中,高使用率的磁盤會移動數據塊到相對低使用率的磁盤,等到滿足一定閾值關系的情況下時,DiskBalancer會漸漸地退出.在DiskBalancer的執行階段,有以下幾點需要注意:

  》帶寬限制:DiskBalancer也可以支持帶寬限制。默認是10M,可以通

  》過配置項dfs.disk.balancer.max.disk.throughputInMBperSec進行控制

  》失敗次數限制:DiskBalancer中會存在失敗次數的控制.在拷貝block數據塊的時候,出現IOException異常,會進行失敗次數的累加計數,如果超出最大容忍值,DiskBalancer也會退出.

  》數據平衡閥值控制:DiskBalancer中可以提供一個磁盤間數據的平衡閾值,以此作為是否需要繼續平衡數據的標准,配置項為dfs.disk.balancer.block.tolerance.percent.

 

diskbalancer執行命令:

hdfs   diskbalancer -query nodename.test.com

生成plan
hdfs  diskbalancer -uri hdfs://.com -plan node1.test.com

執行execute
hdfs  diskbalancer -execute /system/diskbalancer/nodename.plan.json


終止或取消execute
hdfs  diskbalancer -cancel /system/diskbalancer/nodename.plan.json


具體參考https://hadoop.apache.org/docs/r3.0.0/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM