HDFS副本放置策略

时间:2022-09-14 00:19:20

                                              HDFS副本放置策略


       为什么要引入副本的放置策略呢?举个简单的例子。引入副本机制是为了数据的可靠性,那么HDFS将副本放置在不同的机架上即可,这样即防止了整个机架失效数据丢失情况,又可以在读数据时可以利用多个机架的带宽。不过这也带来一个问题,写操作时副本要机架传输,增加了写操作的代价。


  HDFS采用一种称为机架感知的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下,HDFS副本系数是默认为3,HDFS的存放策略是将一个副本存放在本地机架节点上,一个副本存放在同一个机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略不会影响到数据的可靠性和可用性。与此同时,因为数据块只存放在两个不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀的分布在不同的机架上:三分之一的副本在一个节点上,三分之二的副本在一个机架上,其它副本均匀分布在剩下的机架中,这种策略在不损害数据可靠性和读取性能的情况下改进了写的性能。


  在HDFS中,ReplicationTargetChooser这个类负责选择合适数量的DataNode用来存放副本。副本的存放策略为:如果该客户端上有数据节点,那么就应该最优先考虑把正在写入的数据的一个副本保存在这个客户端所在的数据节点上,否则随机选取一个本racket上的DataNode。第二个副本放在另一个不同的机架节点上,第三个副本放在和第一个副本所在机架的不同节点上。所以ReplicationTargetChooser节点选择策略主要有一下几种:


  • 本地节点
private DatanodeDescriptor chooseLocalNode(DatanodeDescriptor localMachine,List<Node> excludedNodes,long blocksize,int maxNodesPerRack,List<DatanodeDescriptor> results)

  • 远程节点
private void chooseRemoteRack(int numOfReplicas, DatanodeDescriptor localMachine, List<Node> excludedNodes, long blocksize,int maxReplicasPerRack,List<DatanodeDescriptor> results)

 

  • 相同rack的另一个节点
private DatanodeDescriptor chooseLocalRack(DatanodeDescriptor localMachine, List<Node> excludedNodes, long blocksize, int maxNodesPerRack, List<DatanodeDescriptor> results)


  • 随机节点
private DatanodeDescriptor[] chooseRandom(int numOfReplicas, String nodes, List<Node> excludedNodes)