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 (- 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
#允许的disk 数据差距,是一个百分数,例如我写的是5,也就是容忍datanode数据的差距是5%
hdfs balancer -threshold #选择需要进行数据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./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集群数据不均衡处理的更多相关文章
- 在不同版本号hdfs集群之间转移数据
在不同版本号hdfs集群之间转移数据 最简单的办法就是把src集群的数据导到本地,然后起还有一个进程将本地数据传到des集群上去. 只是这有几个问题: 效率减少 占用本地磁盘空间 不能应付实时 ...
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...
- 大数据学习之hdfs集群安装部署04
1-> 集群的准备工作 1)关闭防火墙(进行远程连接) systemctl stop firewalld systemctl -disable firewalld 2)永久修改设置主机名 vi ...
- Hadoop基础-HDFS集群中大数据开发常用的命令总结
Hadoop基础-HDFS集群中大数据开发常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本盘博客仅仅列出了我们在实际生成环境中常用的hdfs命令,如果想要了解更多, ...
- Hadoop集群-HDFS集群中大数据运维常用的命令总结
Hadoop集群-HDFS集群中大数据运维常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客会简单涉及到滚动编辑,融合镜像文件,目录的空间配额等运维操作简介.话 ...
- 大数据学习笔记03-HDFS-HDFS组件介绍及Java访问HDFS集群
HDFS组件概述 NameNode 存储数据节点信息及元文件,即:分成了多少数据块,每一个数据块存储在哪一个DataNode中,每一个数据块备份到哪些DataNode中 这个集群有哪些DataNode ...
- sqoop将oracle数据导入hdfs集群
使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...
- SQL Server上唯一的数据库集群:负载均衡、读写分离、容灾(数据零丢失、服务高可用)
SQL Server上唯一的数据库集群:负载均衡.读写分离.容灾(数据零丢失.服务高可用).审计.优化,全面解决数据库用户问题.一键安装,易用稳定,性价比高,下载链接:http://www.zheti ...
- 大数据(2)---HDFS集群搭建
一.准备工作 1.准备几台机器,我这里使用VMware准备了四台机器,一个name node,三个data node. VMware安装虚拟机:https://www.cnblogs.com/niju ...
随机推荐
- RN与webview通讯
一.RN给webview发送信息 this.webview.postMessage(message) 二.监听从React Native发过来的消息: window.document.addEven ...
- [JAVA]JAVA章4 Thread Dump如何分析
一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread- ...
- [杂谈]杂谈章3 JAVA中如何用自动注入
PART1 加配置文件 创建自动加载bean的配置文件 <beans xmlns="http://www.springframework.org/schema/beans" ...
- hadoop 有那些发行版本
hadoop发行版本 1. apache hadoop http://hadoop.apache.org/ 2. cloudera hadoop(CDH) https://www.cloudera. ...
- Unity3D之物理射线
射线:从一个点往一个方向,发射一根无限长的射线,这根射线会与场景中带有 Collider 组件的物体发生碰撞. 射线的使用: public class Test { private void Star ...
- python信息收集之子域名
python信息收集之子域名 主要是以下3种思路: 字典爆破 搜索引擎 第三方网站 0x00 背景知识 list Python内置的一种数据类型是列表:list是一种有序的集合. >>&g ...
- 2-postman批量执行接口
1.postman环境设置与使用 1)点击设置,添加按钮 2)填写环境名称,参数 3)切换环境 4)使用环境变量,使用格式为:{{变量名}} 2.postman批量执行接口 1)选择要执行的文件夹,点 ...
- common-io 文件监听例子
package com.junge.spring.demo.commonio; import org.apache.commons.io.monitor.FileAlterationListenerA ...
- visual studio单项目一次生成多框架类库、多框架项目合并
目录 不同平台框架项目使用同一套代码,一次编译生成多个框架类库 需要先了解的东西 分析 添加PropertyGroup 多目标平台 编译符号和输出目录设置 添加依赖 代码文件处理 主副平台项目文件处理 ...
- Python大法之告别脚本小子系列—信息资产收集类脚本编写(下)
作者:阿甫哥哥 原文来自:https://bbs.ichunqiu.com/article-1618-1.html 系列文章专辑:Python大法之告别脚本小子系列目录: 0×05 高精度字典生成脚本 ...