浅谈hadoop(四)——hadoop简介
本文翻译素材来自hadoop官网:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
Replica Placement: The First Baby Steps
副本存储对于hadoop的可用性和性能很重要。正是这种最优化的副本存储方式把hadoop和其他的分布式框架区分开来。副本存储需要丰富的经验和调整。机架-感知副本存储策略的目的是为了提高可靠性和可用性,同时优化网络带宽。当前已经实现的副本存储策略是在这个方向上的第一步,通过在生产环境中使用这种策略能够更加了解这种策略的表现,从而得到丰富的测试集,为更加复杂的策略做铺垫。
一个大的hdfs分布式集群一般都会跨多个机架。位于两个不同机架的节点通信必须通过一层或多层交换机。通常,在同一机架内部的节点间的带宽要比在不同机架节点间的带宽要高。
hadoop通过外部的hadoop机架感知决定哪个节点属于哪个机架。一个简单的策略是把副本放在单独的机架,但是这种策略不是最优的。这种策略能够防止由于机架发生错误而丢失数据。在读取数据时,这种策略能够通过不同的机架读取数据。当组件错误是,这种策略甚至通过分配副本在集群中的位置进行平衡负载。但是,这种策略增加了写的开销,因为需要把块传输到不同的机架中。
一个常见的情况是这样的:在集群的副本因子是3,一个副本被放在当前机架的当前节点,另一个副本被放在当前机架的不同节点,最后一个放在不同机架的不同节点。这种策略减少了机架间的通信,从而提高性能。机架发生错误的概率比节点发生错误的概率要低。这种策略没有影响数据的可用性和可靠性。不过,由于数据存在于2个机架而不是3个,这种策略确实减少了由于某个节点故障而增加的网络带宽。采用这样的策略,一个文件不需要分布在多个机架中。三个副本,一个在同一节点,另一个再同一机架,还有一个在集群中的一个可用机架中。这种策略在没有降低数据可靠性和读性能的同时增加了写性能。
如果副本因子大于3,那么第四个副本会被随机的存储到其他的机架中,同时需要保证每个机架中的副本数小于如下的公式:(副本数 - 1) / 机架数+ 2
由于namenode不允许datanodes保存一个块的多个副本,所以副本的最大数就是datanodes的个数。
由于namenode不允许datanodes保存一个块的多个副本,所以副本的最大数就是datanodes的个数。
在存储类型和存储策略加入到hdfs中以后,namenode就会采用上面介绍的机架感知策略。namenode首先根据机架感知申请存储副本的节点是否满足要求,如果不符合,那么namenode会继续寻找下一个节点。如果没有节点满足需求,那么就会保存副本在二级目录中。