HDFS学习:HDFS机架感知与副本放置策略

洋哥YARN和HDFS实践系列大作,这是第三篇,前面两篇分别是:

Yarn【label-based scheduling】实战总结(二)

Yarn【label-based scheduling】实战总结(一)

1.1 机架感知(RackAwareness)概述

通常,大型Hadoop集群会分布在很多机架上。在这种情况下,

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

-- 为了提高容错能力,名称节点会尽可能把数据块的副本放到多个机架上。

综合考虑这两点的基础上Hadoop设计了机架感知功能。

1.1.1 外在脚本实现机架感知

HDFS不能够自动判断集群中各个datanode的网络拓扑情况。这种机架感知需要topology.script.file.name属性定义的可执行文件(或者脚本)来实现,文件提供了IP->rackid的翻译。NameNode通过这个得到集群中各个datanode机器的rackid。如果topology.script.file.name没有设定,则每个IP都会翻译成/default-rack。

为了获取机架id,可以写一个小脚本来定义IP(或者DNS名),并把想要的机架id打印到标准输出stdout。

这个脚本必须要在配置文件hadoop-site.xml里通过属性’topology.script.file.name’来指定。

例如:

用Python语言编写的脚本范例:

1.1.2 内部Java类实现机架感知

该处采用配置topology.node.switch.mapping.impl来实现机架感知,需在core-site.xml配置文件中加入以下配置项:

<property>
   <name>topology.node.switch.mapping.impl</name>
   <value>com.dmp.hadoop.cluster.topology.JavaTestBasedMapping</value>
</property>

还需编写一个JAVA类,一个示例如下所示:

public class JavaTestBasedMapping implements DNSToSwitchMapping {
       //key:ip value:rack
       private staticConcurrentHashMap<String,String> cache = new ConcurrentHashMap<String,String>();
       static {
              //rack0 16
              cache.put("192.168.5.116","/ht_dc/rack0");
              cache.put("192.168.5.117","/ht_dc/rack0");
              cache.put("192.168.5.118","/ht_dc/rack0");
              cache.put("192.168.5.120","/ht_dc/rack0");
              cache.put("192.168.5.121","/ht_dc/rack0");
              cache.put("host116","/ht_dc/rack0");
              cache.put("host117","/ht_dc/rack0");
              cache.put("host118","/ht_dc/rack0");
              cache.put("host120","/ht_dc/rack0");
              cache.put("host121","/ht_dc/rack0");
       }
       @Override
       publicList<String> resolve(List<String> names) {
              List<String>m = new ArrayList<String>();
              if (names ==null || names.size() == 0) {
                    m.add("/default-rack");
                    return m;
              }
              for (Stringname : names) {
                    Stringrack = cache.get(name);
                    if (rack!= null) {
                           m.add(rack);
                    }
              }
              return m;
       }
}

将上述Java类打成jar包,加上执行权限;然后放到$HADOOP_HOME/lib目录下运行。

1.1.3 网络拓扑(NetworkTopology)

有了机架感知,NameNode就可以画出上图所示的datanode网络拓扑图。D1,R1都是交换机,最底层是datanode。则H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。这些rackid信息可以通过topology.script.file.name配置。有了这些rackid信息就可以计算出任意两台datanode之间的距离。

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

1.2 副本放置策略(BPP:blockplacement policy)

第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node)。

第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。

第三个副本和第二个在同一个机架,随机放在不同的node中。

如果还有更多的副本,则在遵循以下限制的前提下随机放置

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

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

当发生数据读取的时候,名称节点首先检查客户端是否位于集群中。如果是的话,就可以按照由近到远的优先次序决定由哪个数据节点向客户端发送它需要的数据块。也就是说,对于拥有同一数据块副本的节点来说,在网络拓扑中距离客户端近的节点会优先响应。

Hadoop的副本放置策略在可靠性(block在不同的机架)和带宽(一个管道只需要穿越一个网络节点)中做了一个很好的平衡。下图是备份参数是3的情况下一个管道的三个datanode的分布情况。

原文发布于微信公众号 - 大数据和云计算技术(jiezhu2007)

原文发表时间:2016-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏皮振伟的专栏

[linux][net]网卡多队列对vm exit的影响

前言: 虚拟机性能调试的时候,遇到了external irq对vm造成了exit。 分析: 1,网卡多队列 ? enp130s0f0是Intel Corpor...

3226
来自专栏SAP最佳业务实践

SAP最佳业务实践:外委生产(249)-3采购

可采购半成品物料的 MM 转包处理 物料半成品转包 (S249) 使用 MM 转包流程进行采购。 采购订单序列号管理的前提是激活可用于 ERP 6.0 EhP...

3445
来自专栏杨建荣的学习笔记

一条关于swap争用的报警邮件分析(二)(r8笔记第4天)

最近收到报警,某一个服务器的swap空间有些紧张,查看这台服务器上有两个备库数据库实例,当然负载还是很低的。但是目前来看,内存已经所剩无几,所以自然而然会用到s...

2556
来自专栏张善友的专栏

MongoDB核心贡献者:不是MongoDB不行,而是你不懂!

近期MongoDB在Hack News上是频繁中枪。许多人更是声称恨上了MongoDB,David mytton就在他的博客中揭露了MongoDB许多现存问题。...

19510
来自专栏Spark学习技巧

Spark调优系列之硬件要求

估计所有的spark开发者都很关心spark的硬件要求。恰当的硬件配置需要具体情况具体分析,浪尖在这里给出以下建议。 一,存储系统 因为因为大多数Spark工作...

2038
来自专栏腾讯大数据的专栏

Hadoop Raid-实战经验总结

分布式文件系统用于解决海量数据存储的问题,腾讯大数据采用HDFS(Hadoop分布式文件系统)作为数据存储的基础设施,并在其上构建如Hive、HBase、Spa...

18510
来自专栏我是攻城师

Spark Streaming如何使用checkpoint容错

3777
来自专栏微信终端开发团队的专栏

微信终端跨平台组件 mars 系列(一):高性能日志模块xlog

mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。本文章是 mars 系列的第一篇:高性能跨平台日志模块。

2750
来自专栏数据和云

利用硬链接和truncate降低drop table对线上环境的影响

作者简介 ? 肖鹏 微博研发中心数据库技术负责人,主要负责微博数据库(MySQL/Reids/HBase/Memcached)相关的业务保障,性能优化,架构设计...

3398
来自专栏程序猿DD

Jenkins Pipeline插件十大最佳实践!

Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则。基于 Groovy 中的领域特定语言(DSL),Pipeline...

37710

扫码关注云+社区