副本的放置对HDFS可靠性和性能至关重要。 优化副本放置HDFS有别于其他大多数分布式文件系统。 这是一个功能,需要大量的调优和经验。 基于机架感知(rack awareness)的副本放置策略的目的是为了提高数据可靠性、可用性和网络带宽的利用率。 当前实现的副本放置策略是第一次在这个方向上努力。 实施这一政策的短期目标是验证在生产系统中,了解更多关于它的行为,建立一个测试和研究更复杂的政策基础。

大型HDFS实例运行在集群的计算机通常分布在许多机架上。 在不同机架上的两个节点之间的通信必须经过交换机。 在大多数情况下,同一机架内的机器之间的网络带宽大于不同的机架之间机器的网络带宽。

一个简单但没有优化的策略就是将副本存放在单独的机架上。 这可以防止在整个架失败时数据的丢失,允许从多个机架上读取数据。 这一策略将副本分布在集群中,便于组件的负载平衡失败。 然而,这一策略增加了写的代价,因为一个写操作需要传输block到多个机架。所以Hadoop并没有采用该策略。

NameNode决定每个DataNode所属的机架ID是通过中rack awareness策略。 Hadoop 设计 rack awareness策略 的初衷:

1)希望不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架。

2)为了提高容错能力,namenode会尽可能把block的replica放到多个rack上。

基于rack awareness的replica分配算法 :

1)当一个新的数据块被创建的时候,遵循以下规则:

-- 第1个副本放置于本地节点

-- 第2个副本放置于不同的机架

-- 第3个副本放置于本地机架的不同节点

-- 其余的副本在遵循以下限制的前提下随机放置

-- 1个节点最多放置1个副本

-- 如果副本数少于2倍机架数,不可以在同一机架放置超过2个副本

2)当重新复制一个数据块的时候,遵循以下规则:

-- 如果已有1个副本,把第2个副本放置在不同的机架
                     -- 如果已有2个副本且处于同一机架,把第3个副本放置在不同的机架
                     -- 如果已有2个副本但不处于同一机架,把第3个副本放置在和第1个副本相同的机架
                     -- 当可用副本数超过2个的时候,随机放置

上面所说的随机,其实每个机架上副本的数量低于上限(这个上限基本上是 (replicas - 1)/rack + 2 )。

通常情况下, 设置复制因子3。根据HDFS的分配策略,会将2个副本在一个机架内的2个datanode上,另一个放在不同的机架上的。 这一策略削减机架间写交通通常提高了写性能。 机架失败的概率远低于节点失败的概率,这一政策不会影响数据的可靠性和可用性保证。 然而,它确实减少读取数据时网络带宽使用(因为一块放置在只有两个单独的架,而不是三个)。使用 这一策略时,文件的副本不均匀地分布在机架(三分之一的副本在一个节点上,三分之二的副本是一个架子上,和其他第三均匀分布在剩余的机架)。 这个策略在不影响数据的可靠性的前提下提高了写性能、读取性能。

 

此外:NameNode不允许datanode有多个副本相同的块,最大数量的副本创建datanode的总数。

机架上各个datanode之间的距离的计算:

机架拓扑:

H1..H12 ,H是Host的缩写。就是代表各个机器。通常情况下,一个机器上分配一个datanode。

R1..R4 ,R是Rack的缩写。就是代表机架。通常一个rack上都 有一个交换机。

根据上面所说,每个 node 与父节点的距离是1,那么:

distance(/D1/R1/H1,/D1/R1/H1)=0  相同的datanode
distance(/D1/R1/H1,/D1/R1/H2)=2  同一rack下的不同datanode
distance(/D1/R1/H1,/D1/R1/H4)=4  同一IDC下的不同datanode
distance(/D1/R1/H1,/D2/R3/H7)=6  不同IDC下的datanode

机架的选择  为了减少整体带宽消耗和读延迟,当读取数据时,HDFS 会尽可能的从最接近reader的副本读取。 

Hadoop:Rack Awareness的更多相关文章

  1. Hadoop:相关概念

    Hadoop:相关概念 一.Hadoop简介 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS. 1.特点 (1)HDFS有高容错性的 ...

  2. Hadoop:Hadoop单机伪分布式的安装和配置

    http://blog.csdn.net/pipisorry/article/details/51623195 因为lz的linux系统已经安装好了很多开发环境,可能下面的步骤有遗漏. 之前是在doc ...

  3. 我搭建大数据Hadoop完全分布式环境遇到的坑---hadoop: command not found

    搭建大数据hadoop环境,遇到很多问题,这里记录一部分,以备以后查看. [遇到问题].在安装配置完hadoop以后,需要格式化namenode,输入指令:hadoop namenode -forma ...

  4. Hadoop:操作 Hadoop Cluster

    启动Hadoop 当完成所有的必要配置后,将HADOOP_CONF_DIR目录中的所有配置文件复制到所有机器,建议将HDFS和YARN后台进程一不同的用户身份运行,比如运行HDFS进程们的用户为hdf ...

  5. Hadoop: Hadoop Cluster配置文件

    Hadoop配置文件 Hadoop的配置文件: 只读的默认配置文件:core-default.xml, hdfs-default.xml, yarn-default.xml 和 mapred-defa ...

  6. Hadoop:输入,输出,key,value格式

    map: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3) (K1, V1): jobConf.setInputKeyClas ...

  7. 一篇文看懂Hadoop:风雨十年,未来何去何从

    本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...

  8. Hadoop:Windows 7 32 Bit 编译与运行

    所需工具 1.Windows 7 32 Bit OS(你懂的) 2.Apache Hadoop 2.2.0-bin(hadoop-2.2.0.tar.gz) 3.Apache Hadoop 2.2.0 ...

  9. HDFS机架感知功能原理(rack awareness)

    转自:http://www.jianshu.com/p/372d25352d3a HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和Blo ...

随机推荐

  1. C#的Main(String[] args)参数输入问题

    1.新建一个控制台应用程序,保存在桌面上,Main函数如下所示 using System;using System.Collections.Generic;using System.Linq;usin ...

  2. Espresso浅析和使用

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ Espresso是一个Google官方提供的Android应用UI自动化测试框架.Google希望,当Android的开发者利用Espress ...

  3. Gitpage + hexo(3.0以上)搭建博客

    大半天,一边折腾,一边查找各种文档,写出的这篇文档,不知道有没有把程序表示得足够简明,有不足之处望指明. 前提:已安装好nodeJS和git. 桌面右击进入gitbash,输入npm install ...

  4. Python之argparse模块

    argparse 命令行参数解析模块,原optparse已经停止开发,建议替换为argparse 在python2.7后默认加入 parser ArgumentParser默认解析来源sys.argv ...

  5. [转]开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo

    热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI. ...

  6. spring aop使用

    最近做一个数据库分离的功能,其中用到了spring aop,主要思路就是在service层的方法执行前根据注解(当然也可以根据方法名称,如果方法名称写的比较统一的话)来判断具体使用哪个库.所以想着再回 ...

  7. sqli-libs

    这是抄袭你们  铃兰师姐总结的,尽管她很不情愿. (现在只是第八关,相信她会努力的,一定会做完,我也会随时在这个上面更新的,这个是在本地搭建的,想要这个的可以找你们铃兰师姐要啊!!!) less-1: ...

  8. 如何实现MDI窗体不重复打开同一个子窗体?

    使用MDI窗体时,默认是可以多次打开同一个子窗体的,那么如何控制不重复打开同一个子窗体呢?MDI窗体有个重要属性——MdiChildren,该属性表示MDI窗体打开的子窗体的数组,循环遍历该数组,可以 ...

  9. C#对SQLite、Access数据库操作的封装,很好用的~

    1.对SQLite的封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  10. Function Programming - 柯里化(curry)

    看到一篇非常不错的文章,这里分享给大家:http://www.jianshu.com/p/fa3568087881. 首先,柯里化的定义:你可以只透过部分的参数呼叫一个function,它会回传一个f ...