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
原文地址:https://www.cnblogs.com/cuishuai/p/10026905.html