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
  • 相关阅读:
    Xcode waring: no rule to process file *** 警告提示
    Assigning to "id<CALayerDelegate> _Nullable" from incompatible type "ZXCapture *const __strong" 的警告提示信息
    图片编码简介
    oc温习八:static、extern、const 的了解
    转:Objective-C新特性__nonnull和__nullable
    oc温习七:结构体与枚举
    oc温习六:预处理指令
    oc温习五:字符串
    OC温习四:数组
    oc温习三:常用函数
  • 原文地址:https://www.cnblogs.com/cuishuai/p/10026905.html
Copyright © 2011-2022 走看看