副本的放置对HDFS可靠性和性能至关重要。 优化副本放置HDFS有别于其他大多数分布式文件系统。 这是一个功能,需要大量的调优和经验。 基于机架感知(rack awareness)的副本放置策略的目的是为了提高数据可靠性、可用性和网络带宽的利用率。 当前实现的副本放置策略是第一次在这个方向上努力。 实施这一政策的短期目标是验证在生产系统中,了解更多关于它的行为,建立一个测试和研究更复杂的政策基础。
大型HDFS实例运行在集群的计算机通常分布在许多机架上。 在不同机架上的两个节点之间的通信必须经过交换机。 在大多数情况下,同一机架内的机器之间的网络带宽大于不同的机架之间机器的网络带宽。
一个简单但没有优化的策略就是将副本存放在单独的机架上。 这可以防止在整个架失败时数据的丢失,允许从多个机架上读取数据。 这一策略将副本分布在集群中,便于组件的负载平衡失败。 然而,这一策略增加了写的代价,因为一个写操作需要传输block到多个机架。所以Hadoop并没有采用该策略。
NameNode决定每个DataNode所属的机架ID是通过中rack awareness策略。 Hadoop 设计 rack awareness策略 的初衷:
1)希望不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架。
2)为了提高容错能力,namenode会尽可能把block的replica放到多个rack上。
基于rack awareness的replica分配算法 :
1)当一个新的数据块被创建的时候,遵循以下规则:
-- 第1个副本放置于本地节点
-- 第2个副本放置于不同的机架
-- 第3个副本放置于本地机架的不同节点
-- 其余的副本在遵循以下限制的前提下随机放置
-- 1个节点最多放置1个副本
-- 如果副本数少于2倍机架数,不可以在同一机架放置超过2个副本
2)当重新复制一个数据块的时候,遵循以下规则:
-- 如果已有1个副本,把第2个副本放置在不同的机架
-- 如果已有2个副本且处于同一机架,把第3个副本放置在不同的机架
-- 如果已有2个副本但不处于同一机架,把第3个副本放置在和第1个副本相同的机架
-- 当可用副本数超过2个的时候,随机放置
上面所说的随机,其实每个机架上副本的数量低于上限(这个上限基本上是 (replicas - 1)/rack + 2 )。
通常情况下, 设置复制因子3。根据HDFS的分配策略,会将2个副本在一个机架内的2个datanode上,另一个放在不同的机架上的。 这一策略削减机架间写交通通常提高了写性能。 机架失败的概率远低于节点失败的概率,这一政策不会影响数据的可靠性和可用性保证。 然而,它确实减少读取数据时网络带宽使用(因为一块放置在只有两个单独的架,而不是三个)。使用 这一策略时,文件的副本不均匀地分布在机架(三分之一的副本在一个节点上,三分之二的副本是一个架子上,和其他第三均匀分布在剩余的机架)。 这个策略在不影响数据的可靠性的前提下提高了写性能、读取性能。
此外:NameNode不允许datanode有多个副本相同的块,最大数量的副本创建datanode的总数。
机架上各个datanode之间的距离的计算:
机架拓扑:
H1..H12 ,H是Host的缩写。就是代表各个机器。通常情况下,一个机器上分配一个datanode。
R1..R4 ,R是Rack的缩写。就是代表机架。通常一个rack上都 有一个交换机。
根据上面所说,每个 node 与父节点的距离是1,那么:
distance(/D1/R1/H1,/D1/R1/H1)=0 相同的datanode
distance(/D1/R1/H1,/D1/R1/H2)=2 同一rack下的不同datanode
distance(/D1/R1/H1,/D1/R1/H4)=4 同一IDC下的不同datanode
distance(/D1/R1/H1,/D2/R3/H7)=6 不同IDC下的datanode
机架的选择
为了减少整体带宽消耗和读延迟,当读取数据时,HDFS 会尽可能的从最接近reader的副本读取。 |