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


        hadoop2.4生产集群已经运行一段时间了。由于大量的hadoop1.0上面的应用不断迁移过来,刚开始事hdfs这边还没有出现多少问题,随着时间的推移,最近发现个别的datanode节点上面的磁盘空间剩余严重不足,既集群数据存储严重不均衡,很多DN节点分明还有很多存储空间,而个别DN节点存储空间则出现严重不足的情况。后来经过分析,发现这些空间严重不足的节点上面,都运行了distcp作业的map任务,distcp是一个纯粹拷贝数据的job,一结合hdfs数据副本分配策略一分析,终于找到了问题所在:原来是因为这些空间不足的节点由于运行了distcp作业的map任务,当数据拷贝过来之后,这些数据的第一个副本会选择当前节点作为存储节点存储,随着时间越长,这些运行distcp作业map任务的datanode节点存储的数据就越来越多,自然就出现了存储空间不均衡问题。以下是hdfs存储数据块副本时的分配策略:

HDFS块分配策略



                                                                                               块分配策略流程图

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

一个客户端a机器发起请求分配块请求,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




相关内容