热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hadoop2.6.0HDFSRackAwareness(机架感知)原理与配置步骤详解

Hadoop2.6.0HDFSRackAwareness(机架感知)原理与配置步骤详解前言:  多副本前提下,在访问HadoopHDFS集群时,访问速度直接受到Datanode选取
Hadoop 2.6.0 HDFS Rack Awareness(机架感知)原理与配置步骤详解

前言:
  多副本前提下,在访问Hadoop HDFS集群时,访问速度直接受到Datanode选取策略的影响。Hadoop HDFS提供了一种Rack Awareness机制,以便于粗略计算Client到Datanode的访问开销。本文在Ambari环境下详细分析、介绍两种配置实现机架感知的途径。
(本文基于Hadoop 2.6.0举例)

一、Rack Awareness(机架感知)原理

  关于Rack Awareness的原理,官方文档有比较初步的介绍,简单来说就是在Namenode上维护一个树状数据结构的NetworkTopology对象,用来映射Rack、Datanode之间的关系,当Client通过Namenode访问Datanode时,通过一定的策略计算得到访问各个Replication所在Datanode的“距离”。因为我们总是会“认为”跨网段、跨Rack访问是会消耗更多的带宽资源、导致更大的访问延时的。

《Hadoop 2.6.0 HDFS Rack Awareness(机架感知)原理与配置步骤详解》 一个HDFS Network Topology的例子

图中有两种节点,Innernode和Datanode,其中Innernode可以是root节点,可以是Datacenter、也可以是Rack,代表着所有非数据实体(switch/router)的节点,Innernode的特点是它所有的叶子节点都是Datanode;Datenode的特点是它没有子树或者自己的叶子节点,它本身只能是叶子节点。
在典型的部署工具中,如Ambari、ClouderaManager,都集成了Rack(机架)信息的管理。实际上,更常见的一种NetworkTopology是这样的三层结构:

《Hadoop 2.6.0 HDFS Rack Awareness(机架感知)原理与配置步骤详解》 一种常见的结构

那么,每一个节点都可以用类似文件路径的方式来表示它的定位,比如 /Rack1/Dn1/Dc2/Rack2/Dn4

  • HDFS的写访问机制:

在访问者client对HDFS进行写访问时,执行如下原则:
副本数 = 1时:

  1. 首先挑选与client相同Host的Datanode进行写操作;
  2. 如果没有,则挑选相同Rack的Datanode;
  3. 如果再没有,则随机挑选一个Datanode;

副本数 = 2时:

  1. 第一个副本按照以上原则选取Datanode进行写操作;
  2. 第二个副本选取一个与第一副本不同Rack的Datanode进行写操作;

副本数 = 3时:

  1. 第一、第二副本按照以上原则选取Datanode;
  2. 第三个副本选取与第一个副本同Rack的不同Datanode进行写操作;

副本数 >= 4时:

  1. 前三个副本按照以上原则选取Datanode;
  2. 从第四个副本开始,随机选取Datanode进行写操作;

每个节点只保留一份副本,每个Rack不超过两个副本。

  • HDFS的读访问机制:

HDFS在读取文件的时候会首先获取client的IP,保存在一个clientMachine的字符串对象中,如果是REST调用,则clientMachine就是REST请求发起者,如果是JAVA API访问,clientMachine就是RPC Client。
然后DatanodeManager类会以clientMachine为参数,到NetworkTopology对象里去检索计算它到各个保存有replication的Datanode的距离weight,然后根据weight再进行排序,最后返回给DFSClient进行读取,从而实现“就近”访问。
维护网络拓扑结构的NetworkTopology类是可以自定义的,类名在core-site.xml的net.topology.impl字段里定义,如果该字段未定义,则默认是类org.apache.hadoop.net.NetworkTopology。默认类的计算weight的算法是:

  1. 与clientMachine同Host的Datanode,weight = 0;
  2. 与clientMachine不同Host,但是同Rack的Datanode,weight = 2;
  3. 与clientMachine不同Rack的Datanode,weight = 4;

——实际上就是client到目标Datanode路径长度,如果NetworkTopology类实现了Datacenter,那么对不同Datacenter的Datanode,weight = 6;

二、HDFS实现Rack Awareness的技术途径

  1. Java类直接静态解析

由core-site.xml中的 net.topology.node.switch.mapping.impl字段指定一个自定义实现DNSToSwitchMapping接口类的类:
以下是javashooter给出的一个简单例子:

public class JavaTestBasedMapping implements DNSToSwitchMapping {
//key:ip value:rack
private static ConcurrentHashMap cache = new ConcurrentHashMap();
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
public List resolve(List names) {
List m = new ArrayList();

if (names == null || names.size() == 0) {
m.add("/default-rack");
return m;
}

for (String name : names) {
String rack = cache.get(name);
if (rack != null) {
m.add(rack);
}
}

return m;
}
}

core-site.xml文件相应的字段修改如下:


topology.node.switch.mapping.impl
com.dmp.hadoop.cluster.topology.JavaTestBasedMapping

  1. Java调用外部脚本解析mappingFile

HDFS默认使用的是内置的 org.apache.hadoop.net.ScriptBasedMapping 类,用来调用外部脚本来解析net.topology.script.file.name字段指定的数据文件。

以下是官方文档给出的bash脚本和数据文件示例(为了强调是bash脚本,我特意增加了脚本的#-bang):

#!/bin/bash
#mapping.sh
HADOOP_COnF=/etc/hadoop/conf
while [ $# -gt 0 ] ; do
nodeArg=$1
exec<${HADOOP_CONF}/topology.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ] ; then
result="${ar[1]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default/rack "
else
echo -n "$result "
fi
done

dataFile: mapping.data

hadoopdata1.ec.com /dc1/rack1
hadoopdata1 /dc1/rack1
10.1.1.1 /dc1/rack2

core-site.xml文件相应的字段修改如下:


topology.node.switch.mapping.impl
org.apache.hadoop.net.ScriptBasedMapping


net.topology.script.file.name
mapping.sh

  1. 基于配置文件的静态解析

HDFS内置的类org.apache.hadoop.net.StaticMapping实现了对core-site.xml
hadoop.configured.node.mapping配置项定义的主机/rack映射关系的解析,相关配置项的格式为:


topology.node.switch.mapping.impl
org.apache.hadoop.net.StaticMapping


hadoop.configured.node.mapping
192.168.6.10=/rack1,192.168.6.11=/rack2

  1. TableMapping解析

HDFS内置的 org.apache.hadoop.net.TableMapping 类,实现的是对mappingFile的直接解析,mappingFile的格式如下:

192.168.6.10 /rack1
192.168.6.11 /rack2

mappingFile由net.topology.table.file.name配置项定义

几种方法各有优缺点,实际运用中可以灵活组合使用。Ambari和ClouderaManager默认使用的都是ScriptBasedMapping类调用脚本解析。

三、利用Rack Awareness机制对HDFS读取访问进行优化

  有了对以上的机制了解,就可以做一些工作来优化HDFS的读取流程,因为在很多情况下,HDFS的用户在物理上是跟Datanode节点同一网段的,这样可以视作是同一个Rack,而因为代表用户的ClientMachine没有Rack信息,在NetworkTopology中会被视作与所有Datanode不同Rack,这显然是不合理的,通过阅读源码,发现DatanodeManager类中有对非Datanode的节点Rack信息的处理,所以,可以考虑把clientMachine引入NetworkTopology,但不归入Datanode,同样作为叶子节点参与路径长度weight的计算,这样就能够更加科学的对包含数据副本的Datanode进行排序,实现读速度优化的目标。这里就不贴源码献丑了。
  另外,还可以对通过修改net.topology.impl改变Hadoop使用的NetworkTopology工具类,自己设计构造网络拓扑结构的算法,实现对具体场景下HDFS文件读访问的优化。

以上内容引用部分均以文字说明或链接方式给出。
欢迎转载,转载请联系我并注明来源。


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
安徒生笔下苍老了谁1_120
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有