副本的放置对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. Servlet编程实例1

    编程目的:使用JSP+servlet,来实现一个登陆页面,登陆成功则提示成功,登陆失败则提示失败. 编程要求:登陆页面由login.jsp负责显示,登陆成功由success.jsp负责显示,登陆失败由 ...

  2. Winform界面中主从表编辑界面的快速处理

    在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...

  3. 为什么我的子线程更新了 UI 没报错?借此,纠正一些Android 程序员的一个知识误区

    开门见山: 这个误区是:子线程不能更新 UI ,其应该分类讨论,而不是绝对的. 半小时前,我的 XRecyclerView 群里面,一位群友私聊我,问题是: 为什么我的子线程更新了 UI 没报错? 我 ...

  4. Java学习笔记12---向上转型-父类的对象引用指向子类对象

    当父类的对象引用没有指向父类的对象,而是指向了子类的对象时,调用方法或访问变量时会怎样呢? 假设父类为Person,子类为Student,有下面的两行定义: Student sTest = new S ...

  5. 关于svg

    动画:css3动画,canvas(js动画),svg(html动画). svg基本元素 version: 表示 <svg> 的版本,目前只有 1.0,1.1 两种 xmlns:http:/ ...

  6. 内存泄漏监测-LeakCanary

    内存泄漏监测方法之使用LeakCanary LeakCanary出处: github:https://github.com/square/leakcanary/issues square 公司 这个公 ...

  7. python实战===如何优雅的打飞机

    这是一个打飞机的游戏,结构如下: 其中images中包含的素材为 命名为alien.png    命名为ship.png 游戏效果运行是这样的: 敌军,也就是体型稍微大点的,在上方左右移动,并且有规律 ...

  8. head first python菜鸟学习笔记(第七章) ——web应用之为数据建模

    问题1. #意思是从athletelist.py中导入AthleteListfrom athletelist import AthleteList 源程序代码 import pickle from a ...

  9. springboot学习(二)——springmvc配置使用

    以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从s ...

  10. Thinkphp导入外部类的方法

    相信很多人在使用TP时候都苦恼使用外部类各种不成功 下面为大家详细介绍下引用方法和注意细节 手动加载第三方类库 由于第三发类库没有具体的命名空间,所以需要使用以下几种方法手动导入 1.import方法 ...