HDFS副本选择策略

  在client向DataNode写入block之前,会与NameNode有一次通信,由NameNode来选择指定数目的DataNode来存放副本。具体的副本选择策略在BlockPlacementPolicy接口中,其子类实现是BlockPlacementPolicyDefault。该类中会有多个chooseTarget()方法重载,但最终调用了下面的方法:

 1 /**
 2    * This is not part of the public API but is used by the unit tests.
 3    */
 4   DatanodeDescriptor[] chooseTarget(int numOfReplicas,
 5                                     DatanodeDescriptor writer,
 6                                     List<DatanodeDescriptor> chosenNodes,
 7                                     HashMap<Node, Node> excludedNodes,
 8                                     long blocksize) {
 9       //numOfReplicas:要选择的副本个数
10       //clusterMap.getNumOfLeaves():整个集群的DN个数
11     if (numOfReplicas == 0 || clusterMap.getNumOfLeaves()==0) {
12       return new DatanodeDescriptor[0];
13     }
14
15     //excludedNodes:排除的DN(因为有些DN已经被选中,所以不再选择他们)
16     if (excludedNodes == null) {
17       excludedNodes = new HashMap<Node, Node>();
18     }
19
20     int clusterSize = clusterMap.getNumOfLeaves();
21     //总的副本个数=已选择的个数 + 指定的副本个数
22     int totalNumOfReplicas = chosenNodes.size()+numOfReplicas;
23     if (totalNumOfReplicas > clusterSize) {    //若总副本个数 > 整个集群的DN个数
24       numOfReplicas -= (totalNumOfReplicas-clusterSize);
25       totalNumOfReplicas = clusterSize;
26     }
27
28     //计算每个一个rack能有多少个DN被选中
29     int maxNodesPerRack =
30       (totalNumOfReplicas-1)/clusterMap.getNumOfRacks()+2;
31
32     List<DatanodeDescriptor> results =
33       new ArrayList<DatanodeDescriptor>(chosenNodes);
34     for (DatanodeDescriptor node:chosenNodes) {
35       // add localMachine and related nodes to excludedNodes
36       addToExcludedNodes(node, excludedNodes);
37       adjustExcludedNodes(excludedNodes, node);
38     }
39
40     //客户端不是DN
41     if (!clusterMap.contains(writer)) {
42       writer=null;
43     }
44
45     boolean avoidStaleNodes = (stats != null && stats
46         .shouldAvoidStaleDataNodesForWrite());
47
48     //选择numOfReplicas个DN,并返回本地DN
49     DatanodeDescriptor localNode = chooseTarget(numOfReplicas, writer,
50         excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes);
51
52     results.removeAll(chosenNodes);
53
54     // sorting nodes to form a pipeline
55     //将选中的DN(result中的元素)组织成pipe
56     return getPipeline((writer==null)?localNode:writer,
57                        results.toArray(new DatanodeDescriptor[results.size()]));
58   }

  方法含义大概就如注释中写的,不过要注意其中的变量含义。在第48行,又调用chooseTarget()方法来选择指定数目的DN(选中的DN存放在result中),并返回一个DN作为本地DN。下面分析这个方法。

时间: 2024-08-04 17:50:59

HDFS副本选择策略的相关文章

HDFS副本放置策略

前言 前一篇文章中刚刚分析完HDFS的异构存储以及相关的存储类型选择策略,浏览量还是不少的,说明大家对于HDFS的异构存储方面的功能还是很感兴趣的.但是其实一个文件Block块从最初的产生到最后的落盘,存储类型选择策略只是其中1步,因为存储类型选择策略只是帮你先筛选了一些符合存储类型要求的存储节点目录位置列表,通过这些候选列表,你还需要做进一步的筛选,这就是本文所准备阐述的另外一个主题,HDFS的副本放置策略.在写本文之前,我搜过网上关于此方面的资料与文章,还是有许多文章写的非常不错的,所以我会

HDFS副本放置策略及机架感知

副本放置策略 副本放置策略的基本思想是: 第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node). 第二个副本放置在与第一个节点不同的机架中的node中(随机选择). 第三个副本和第二个在同一个机架,随机放在不同的node中. 如果还有更多的副本就随机放在集群的node里. Hadoop的副本放置策略在可靠性(block在不同的机架)和带宽(一个管道只需要穿越一个网络节点)中做了一个

HDFS副本存放策略

儇x7月帜心时pr关俸邑忱秆涣匀废懒惭级zt恋鞍蔚http://blog.sina.com.cn/s/blog_17caca6250102xjv0.html托ll比访纪巡13毓揪惶亢敦方蓟泻猩妹然96悠谈共http://blog.sina.com.cn/s/blog_17c5d1dc90102xh63.html俨1l掩仓桨赐3h泌克孪院对慌蹦恃屯看疗34匦儇郴http://blog.sina.com.cn/s/blog_17c45bb7d0102xaor.html寂y2佑颈废睹6a慈链卧礁拍劣偻

DataNode引用计数磁盘选择策略

前言 在HDFS中,所有的数据都是存在各个DataNode上的.而这些DataNode上的数据都是存放于节点机器上的各个目录中的,而一般每个目录我们会对应到1个独立的盘,以便我们把机器的存储空间基本用上.这么多的节点,这么多块盘,HDFS在进行写操作时如何进行有效的磁盘选择呢,选择不当必然造成写性能下降,从而影响集群整体的性能.本文来讨论一下目前HDFS中存在的几个磁盘选择策略的特点和不足,然后针对其不足,自定义1个新的磁盘选择策略. HDFS现有磁盘选择策略 上文前言中提到,随着节点数的扩增,

HDFS副本存放读取

HDFS作为Hadoop中 的一个分布式文件系统,而且是专门为它的MapReduce设计,所以HDFS除了必须满足自己作为分布式文件系统的高可靠性外,还必须为 MapReduce提供高效的读写性能,那么HDFS是如何做到这些的呢?首先,HDFS将每一个文件的数据进行分块存储,同时每一个数据块又保存有多个 副本,这些数据块副本分布在不同的机器节点上,这种数据分块存储+副本的策略是HDFS保证可靠性和性能的关键,这是因为:一.文件分块存储之后按照数据 块来读,提高了文件随机读的效率和并发读的效率:二

HDFS读写数据块--${dfs.data.dir}选择策略

最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要的角度来读这部分代码的. 1 hdfs-site.xml 2 <property> 3 <name>dfs.data.dir</name> 4 <value>/mnt/datadir1/data,/mnt/datadir2/data,/mnt/datadir3/

HDFS副本放置节点选择的优化

前言 我们都知道,HDFS在准备写文件块的时候,必须要做的一个步骤是要从集群内数以千计的节点中选择一个有效的节点作为待写入块的目标节点.那么这里何为"有效的节点"呢?指的是此节点内包含有快文件需要的Storage Type(存储类型).比如说某block要求的类型是SSD,而当前选出的节点所有数据目录都是DISK的话,那这个节点就不是满足要求的节点,此轮选举就会被废弃,将选过的节点加入exclude列表,然后重新进行下一轮的选取.所以在这里,笔者想要只要聊聊其中选择效率的问题.这种策略

大数据:Hadoop(HDFS 的设计思路、设计目标、架构、副本机制、副本存放策略)

一.HDFS 的设计思路 1)思路 切分数据,并进行多副本存储: 2)如果文件只以多副本进行存储,而不进行切分,会有什么问题 缺点 不管文件多大,都存储在一个节点上,在进行数据处理的时候很难进行并行处理,节点可能成为网络瓶颈,很难进行大数据的处理: 存储负载很难均衡,每个节点的利用率很低: 二.HDFS 的设计目标 Hadoop Distributed File System(HDFS):源于Google 的 GFS 论文: 设计目标 分布式存储:根据需要,水平横向增加节点: 运行在普通廉价的硬

HDFS副本机制&amp;负载均衡&amp;机架感知&amp;访问方式&amp;健壮性&amp;删除恢复机制&amp;HDFS缺点

副本机制 1.副本摆放策略 第一副本:放置在上传文件的DataNode上:如果是集群外提交,则随机挑选一台磁盘不太慢.CPU不太忙的节点上:第二副本:放置在于第一个副本不同的机架的节点上:第三副本:与第二个副本相同机架的不同节点上:如果还有更多的副本:随机放在节点中: 2.副本系数 1)对于上传文件到HDFS时,当时hadoop的副本系数是几,那么这个文件的块副本数就有几份,无论以后怎么更改系统副本系数,这个文件的副本数都不会改变,也就是说上传到HDFS系统的文件副本数是由当时的系统副本数决定的