Hadoop复制模型 - DataStreamer / Namenode

时间:2012-06-12 19:07:00

标签: hadoop hdfs

首先,感谢您阅读我的问题!

我目前正在研究Hadoop的复制模型,但我处于死胡同。我从“ Oreilly Hadoop The Definitive Guide第3版2012年1月”一书中学习。为了解决这个问题,我首先需要阅读书中的正文。

第73页,有以下内容:

DistributedFileSystem 为客户端返回 FSDataOutputStream Hadoop分布式文件系统开始写入数据。就像在读取案例中一样, FSDataOutputStream 包装 DFSOutput Stream ,它处理与datanode和namenode的通信。当客户端写入数据时(步骤3),

DFSOutputStream 将其拆分为数据包,并将其写入内部队列,称为数据队列。数据队列由Data Streamer使用,Data Streamer的职责是通过选择合适的数据节点列表来请求namenode分配新块来存储副本。“*

如您所见, DFSOutputStream 具有数据包的数据队列。 DataStreamer正在使用数据队列,它要求namenode分配新块。

我的问题:

这是如何运作的?

Namenode如何分配新块?

同样的问题,请问不同: Namenode如何创建合适的Datanode列表?

我在互联网或书中找不到任何相关信息。这本书从高层次解释了这个过程。

我真的很感谢你的时间帮助我,谢谢你!

3 个答案:

答案 0 :(得分:1)

这是一种可插入的,基于策略的算法。有关详细信息,请参阅Replica Placement

答案 1 :(得分:1)

我可能会看到两个不同的问题,因为您还提到了DataStreamer

您可以在" Konstantin Shvachko的Hadoop分布式文件系统,Hairong Kuang,Sanjay Radia,Robert Chansler"

中找到答案

1)如何从客户端(DataStreamer)请求块?

  

当客户端写入时,它首先要求NameNode选择DataNode   托管文件第一个块的副本。客户组织   从节点到节点的管道并发送数据。当第一块时   如果已填充,则客户端会请求选择新的DataNode进行托管   下一个街区的复制品。组织了一个新的管道,并且   客户端发送文件的更多字节。每个DataNodes的选择   可能会有所不同。

2)NameNode如何创建合适的数据节点列表?

正如其他用户已经回答的那样,Hadoop允许此策略可配置,但作为默认副本放置策略:

  

创建新块时,HDFS会放置第一个副本   写入者所在的节点,第二个和第三个节点   在不同机架中的两个不同节点上的副本,其余的   被放置在随机节点上,其限制不超过   一个副本放置在一个节点上,不超过两个副本   当副本数量较少时,将它们放在同一个机架中   机架数量的两倍以上。

答案 2 :(得分:1)

查看Apache HDFS Design enter image description here

例如,当复制因子为3时,HDFS的放置策略如下grepcode

** The class is responsible for choosing the desired number of targets
 * for placing block replicas.
 * The replica placement strategy is that if the writer is on a datanode,
 * the 1st replica is placed on the local machine, 
 * otherwise a random datanode. The 2nd replica is placed on a datanode
 * that is on a different rack. The 3rd replica is placed on a datanode
 * which is on a different node of the rack as the second replica.
 */
@InterfaceAudience.Private
public class BlockPlacementPolicyDefault extends BlockPlacementPolicy {

此策略可以减少机架间写入流量,从而提高写入性能。

机架故障的可能性远小于节点故障的可能性;此策略不会影响数据可靠性和可用性保证。

使用此策略时,文件的副本不会均匀分布在机架上。

  

三分之一的副本位于一个节点上

     

三分之二的副本在一个机架上

     

另外三分之一均匀分布在剩下的机架上。

此策略可在不影响数据可靠性或读取性能的情况下提高写入性能。

==>

第一个和第三个副本存在于一个RAC上,第二个副本存在于其他RAC(远程)