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是否符合要求;