HDFS集群磁盘倾斜不均衡的解决方案

一、引起磁盘倾斜不均衡的可能原因有哪些
(1)扩容节点,向集群中添加新的数据节点
(2)数据节点之间的磁盘大小不一致

二、磁盘倾斜引起的性能问题
(1)MR程序无法很好地利用本地计算的优势
(2)机器之间无法达到更好的网络带宽使用率
(3)机器磁盘无法利用

三、解决磁盘倾斜的方案
(1)使用数据均衡工具手动balance
如果是cm,选择“重新平衡”;
如果是手动的hadoop集群,使用命令:
start-balancer.sh -threshold 20 -policy blockpool -include -f /tmp/ip.txt
上面的命令通过手工筛选出磁盘高的和磁盘低的放在ip.txt文件中,这样balance就只通过这文件里的了,另外还需要设置适当的threshold值,因为是多namespace的,所以需要选择blockpool模式。
另外带宽也是限制balance的一个因素,在hdfs-site.xml中是有设置的:

<property>  
    <name>dfs.datanode.balance.bandwidthPerSec</name>   
    <value>10485760</value>   
</property>

但是这个需要重启,hadoop提供了一个动态调整的命令:
hdfs dfsadmin -fs hdfs://ns1:8020 -setBalancerBandwidth 104857600
hdfs dfsadmin -fs hdfs://ns2:8020 -setBalancerBandwidth 104857600

(2)上下节点
其实将高磁盘的节点强制Decommission是最快最有效的方案。
下节点的时候可能会出现有ns不能正常下掉的情况,其实这个时候节点的数据大部分已经移出去了,可能有一些块卡在那边没有移出去。
这个时候只能一个一个节点将已经Decommissioned节点stop掉datanode进程,如果在namenode的页面上看到有丢失块的话,就需要将这个块先get到本地,在put上去。例如:
hdfs dfs -get hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo
hdfs dfs -put -f 000816_0.lzo hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo
hdfs dfs -chown test1:test1 hdfs://ns1/test1/dt=2016-07-24/000816_0.lzo
前提条件需要将这个节点的datanode重新启动。

(3)升降数据副本
升降副本是一个迫不得已的办法,这样如果datanode有挂掉节点,就会增加丢失块的几率。
具体降副本的命令如下:
hdfs dfs -setrep -R -w 2 hdfs://ns1/tmp/test.db
升副本的命令如下:
hdfs dfs -setrep -R -w 3 hdfs://ns1/tmp/test.db
上面的命令是将ns1下的/tmp/test.db副本数降至2个,然后又将它升至3个副本。这样动态的升降副本可以解决。
另外在升降副本的遇到一个BUG,过程中可能会出现夯住的情况,推测可能是namenode的replications模块有夯住情况,所以出现该情况执行kill掉进行,跳过该块再跑。
总结:之所以选择使用升降副本是因为它不受带宽的控制,另外在升降副本的时候hadoop是需要重新写数的,这个时候它会优先往磁盘低写数据,这样就能将磁盘高的数据迁移至磁盘低的。

(4)提高dfs.datanode.du.reserved值
官方解释为:适用于非分布式文件系统 (DFS) 使用的保留空间(字节/卷)。
通俗的意思:预留磁盘的一部分空间给操作系统用,这个参数主要是为了防止磁盘空间被写满导致的HDFS异常。通常系统默认保留5%的磁盘空间给操作系统用。
所以,当主机的dfs.datanode.du.reserved值高于目前磁盘使用的情况,namenode就不会分配数据过来了

(5)关闭nodemanger进程
在现有计算资源多余的情况下,可以考虑关闭高磁盘节点的nodemanager,避免在该节点起YarnChild,因为如果在该节点上进行计算的话,数据存储首先会往本地写一份,这样更加加重了本地节点的负担。

(6)distcp方式(我没太明白为什么要用这个方式)
distcp与cp两者的区别如下:
CP的模式是不走mapreduce的;DISTCP的模式是走mapreduce的,所以它优先写有nodemanager的机器;
CP是单线程的,类似scp的模式,在执行速度上比DISTCP要慢很多。

(7)删除旧数据(我感觉是删除磁盘下的数据,而不是dfs数据)
该方案是在迫不得已的情况下进行的,因为删掉的数据可能以后还得补回来,这样的话又是得要浪费一定的时间。
另外在删除数据时候就得需要跳过回收站才能算是真正删除,可以使用的命令如下:
Hadoop dfs -rmr -skipTrash /tmp/output

四、应用场景
(1)在非机器磁盘故障的情况下,例如200节点的集群,有3或者4台dn节点出现磁盘爆满情况,常见的解决方案有:
因为爆满的主机数较少,可以采用上下节点方式解决

(2)考虑到有多达600台机器磁盘使用率达到94%,而且这部分高的机器是在同一个机房的,所以不能采用上下节点的方法,最好的办法如下:
1、提高dfs.datanode.du.reserved的值;
2、关闭nodemanager进程;
3、升降副本;
4、启动hadoop自带的balance;

五、注意区别HDFS节点之间数据不均衡与HDFS节点内磁盘数据不均衡
上面给出的是HDFS节点之间数据不均衡的解决方法,如果想要解决节点内磁盘数据不均衡,可以参考:
https://blog.csdn.net/Androidlushangderen/article/details/51776103

参考网址:
http://www.aboutyun.com/thread-19959-1-1.html https://blog.csdn.net/Androidlushangderen/article/details/51776103

猜你喜欢

转载自blog.csdn.net/qq_34477362/article/details/82662378