zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDU 1261 字串数(排列组合)
    Codeforces 488C Fight the Monster
    HDU 1237 简单计算器
    POJ 2240 Arbitrage
    POJ 3660 Cow Contest
    POJ 1052 MPI Maelstrom
    POJ 3259 Wormholes
    POJ 3268 Silver Cow Party
    Codesforces 485D Maximum Value
    POJ 2253 Frogger(最短路)
  • 原文地址:https://www.cnblogs.com/cuishuai/p/10026905.html
Copyright © 2011-2022 走看看