distcp导致个别datanode节点数据存储严重不均衡分析

        hadoop2.4生产集群已经执行一段时间了。因为大量的hadoop1.0上面的应用不断迁移过来。刚開始事hdfs这边还没有出现多少问题。随着时间的推移,近期发现个别的datanode节点上面的磁盘空间剩余严重不足。既集群数据存储严重不均衡,非常多DN节点分明还有非常多存储空间,而个别DN节点存储空间则出现严重不足的情况。

后来经过分析,发现这些空间严重不足的节点上面,都执行了distcp作业的map任务,distcp是一个纯粹拷贝数据的job。一结合hdfs数据副本分配策略一分析,最终找到了问题所在:原来是因为这些空间不足的节点因为执行了distcp作业的map任务,当数据拷贝过来之后,这些数据的第一个副本会选择当前节点作为存储节点存储,随着时间越长,这些执行distcp作业map任务的datanode节点存储的数据就越来越多,自然就出现了存储空间不均衡问题。

该问题眼下还没有好的解决的方法,临时仅仅能不定期重新启动distcopy作业。让map任务能随机的在集群其它节点启动起来。

下面是hdfs存储数据块副本时的分配策略:

HDFS块分配策略



                                                                                               块分配策略流程图

注:上图提到的远程机架与本地机架是相对于找到的第一个副本的目标节点来说。

一个clienta机器发起请求分配块请求,NN接收到请求后。运行例如以下块分配流程:

1)   假设a不是一个DataNode,则在集群范围内随机选择一个节点作为目标节点,否则运行以下的2,3步骤;

2)  推断a机器是否符合存储数据块的目标节点,假设符合,第一个块副本分配完成。

3)假设a机器不符合作为目标节点。则在于与a机器同机架范围内寻找。假设找到目标节点,第一个块副本分配完成;

4)假设在同一个机架内未找到符合要求的目标节点。则在集群内随机查找,找到则第一个块副本分配完成,否则未找到符合条件的块。块分配失败;

5)假设已经成功分配第一个块副本,则与a不同机架的远程机架内寻找目标节点。假设符合,第二个块副本分配完成;

6)假设在远程机架内未找到符合要求的目标节点,在与a同样的本机架寻找,假设找到则第二个块副本分配完成;否则未找到符合条件的块,第二份块分配失败;

7)假设前2个块副本分配成功。则准备分配第三个副本的目标节点,首先会推断前两份是否在同一个机架,假设是,则在远程机架寻找目标节点,找到则第三份副本分配完成。假设前两份在不同机架。则在与a同样机架内寻找,假设找到则第三份副本分配完成。否则在集群范围寻找,找到则第三份分配完成。否则第三份分配失败

8)假设块副本大于三分,则在集群范围内随机寻找节点

 

在上面的块分配流程图中,重复出现满足条件的节点推断,要推断一个节点是否满足条件,须要经过例如以下流程,流程图例如以下:


当在一个范围内找到一个节点后。还须要经过如上的条件推断,才干确定一个DataNode进程能否够作为目标节点:

1)  假设没有节点机器被选择,则该节点能够作为备选节点,否则须要推断下一个DataNode

是否符合要求;(这样就防止同一个块副本存储到同一台机器)

2)  然后推断节点是否退役,存储空间是否足够,负载是否大于2倍平均负载。本机架选择的节点是否超过限制,假设均满足,则该datanode符合要求,否则须要推断下一个DataNode是否符合要求;

參考:

http://blog.csdn.net/liuhong1123/article/details/12949487

http://blog.csdn.net/liuhong1123/article/details/16117211

http://blog.csdn.net/chenpingbupt/article/details/7972589

原文地址:https://www.cnblogs.com/gavanwanggw/p/7161655.html