首先,感谢您阅读我的问题!
我目前正在研究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列表?
我在互联网或书中找不到任何相关信息。这本书从高层次解释了这个过程。
我真的很感谢你的时间帮助我,谢谢你!
答案 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)
例如,当复制因子为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(远程)
上