HDFS集群数据不均衡处理

摘要:
您可以使用磁盘平衡器在磁盘之间平衡数据。内部数据节点用于处理此问题。然而,它仅在Hadoop 3.0中受支持,因此您需要升级Hadoop的版本。通常,升级现有群集可能会导致一些问题。如果可以升级,建议直接升级,因为Hadoop的新版本大大提高了性能,与2.x版本不同。

一、概述

公司使用是自己搭建的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 forInfinite) before exit.

Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value forgiven 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 inthe 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

免责声明:文章转载自《HDFS集群数据不均衡处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇memcached-tool 工具CentOS 6安装Oracle 11gR2数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

hdfs command

hadoop fs -ls hdfs dfs -mkdir -p /user/$(whoami) hdfs dfs -chown -R $(whoami) /user/$(whoami) hdfs dfs -chmod -R 750 /user/$(whoami)...

Elasticsearch之批量操作bulk

1、bulk相当于数据库里的bash操作。 2、引入批量操作bulk,提高工作效率,你想啊,一批一批添加与一条一条添加,谁快? 3、bulk API可以帮助我们同时执行多个请求 4、bulk的格式: action:index/create/update/delete metadata:_index,_type,_id request body:_sourc...

将txt、csv等文本文件导入Hive

将txt、csv等文本文件导入Hive 目录 将txt、csv等文本文件导入Hive 00.数据在虚拟机外 01.启动hadoop、hdfs 02.将文件放置在hdfs目录下 03.登录hive并进入指定数据库 04.根据文件创建表 05.执行导入语句 00.数据在虚拟机外 如果数据在虚拟机内,请跳过此步,直接执行接下来的操作。 推荐使用Sec...

CDH搭建Hadoop分布式服务器集群(java新手小白)

1首先对于一个java还白的小白,先理解CDH与Hadoop的关系 一、Hadoop版本选择。 Hadoop大致可分为Apache Hadoop和第三方发行第三方发行版Hadoop,考虑到Hadoop集群部署的高效,集群的稳定性, 以及后期集中的配置管理,业界多使用Cloudera公司的发行版,简称为CDH。 下面是转载的Hadoop社区版本与第三方发行版...

namenode无法启动(namenode格式化失败)

格式化namenode root@node04 bin]# sudo -u hdfs hdfs namenode –format 16/11/14 10:56:51 INFO namenode.NameNode: STARTUP_MSG: /*******************************************************...

日志采集框架Flume以及Flume的安装部署(一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统)

 Flume支持众多的source和sink类型,详细手册可参考官方文档,更多source和sink组件 http://flume.apache.org/FlumeUserGuide.html Flume官网入门指南:  1:Flume的概述和介绍: (1):Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。(2):Flume可...