hadoop集群负载均衡

    一个良好的hadoop集群应该是数据均匀的分布在各个节点上,而不是一个节点磁盘都满了,而另一个磁盘使用率才不到10%,这里简单介绍一下hadoop数据存储的原理以及如何保证数据均匀的分布在各个节点上。

    本地数据上传hdfs存储流程:

        第一块副本:首先集群会判断该上传主机是不是DataNode,如果是DataNode,并且空间够用的情况下,会首先把数据存储在本DataNode上(重点),如果上传主机不是DataNode,则会找个磁盘不太慢的节点进行数据存储

        第二块副本:如配置机架并在配置文件中进行指定,则第二块副本会存储在不同的机架的磁盘空间富足的节点上,如未配置机架,会随机找一个磁盘空间富足的节点进行数据存储

        第三块副本:按照第二块副本存储的机制进行存储    

    到这里大家就会发现问题了,对于生产集群来说,为了提高主机的利用率,一般上传数据节点一般也有DataNode的功能,这样问题就来了,对于日复一日的数据传输来说,上传数据的DataNode数据存储磁盘使用率肯定很高,而且就算上传数据主机非DataNode,但对于任务繁重的hadoop集群来说,大量的数据导入和数据清理都会导致各个节点上数据的失衡。

    那么问题来了,就算我的集群数据不均衡,又有什么影响呢?

    大家都知道hadoop集群在进行计算时使用的是mr,集群数据的不均衡,就无法利用mr本地化计算的,就是对于主机A来说,运行的map任务需要的数据不在主机A上,在主机B上,那么就要进行跨节点的数据读取,肯定一定程度上减缓了任务的执行效率,尤其对于磁盘使用率达到100%的节点来说,甚至导致任务失败。

    为了防止集群数据的不均衡,集群资源不能充分利用,所以hadoop中存在数据均衡机制(以下简称:balancer),启动balancer任务后集群会自动读取各个节点磁盘使用情况,根据设置的主机空间使用率差值来进行计算,从远超该平均值的节点数据开始往空间使用率低于该平均值的主机开始进行数据复制,复制完成之后删除原节点数据,因为数据的复制传输会占用磁盘IO,所以为了不影响集群正常提供服务,该复制传输效率低下,通过hdfs-site.xml配置文件可以设置,如集群数据变化量不大,使用默认值,如数据均衡速度达不到要求,可修改该配置文件以下参数进行修改:

  1. <property>  
  2. <name>dfs.balance.bandwidthPerSec</name>  
  3. <value>1048576</value> =>1M/s  
  4. </property></span> 

    数据均衡的配置:

    在任意一集群节点上使用 hadoop balancer -Threshold 10 命令即可进行集群数据的均衡,英文不解释,对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。

    定时任务的设置:

    知道数据均衡的方法了,但总不能我每天盯着看吧,而且今天数据均衡了,但是明天来新的数据导致失衡怎么办,那就用到了定时任务,大家可根据集群的数据变化量来进行定时任务的执行,例如:我们公司集群周末没人用,那我可以把时间设置为周五晚上,或者我们公司每月月初有大量数据导入,我可以把数据均衡时间设置在数据导入完毕之后,以下附带一个简单的每周周五晚上10点进行数据均衡的crontab设置:

00 22 * * 5 hadoop balancer -Threshold 5 >>/home/zcb/log/balancer_`date +"\%Y\%m\%d"`.log 2>&1


纯手工敲打,希望点赞评论谢谢!



猜你喜欢

转载自blog.csdn.net/zcb_data/article/details/80228625
今日推荐