HDFS Rack Awareness详解
目录:
1.机架感知介绍
2.HDFS读写访问机制
3.机架感知实现
4.机架感知扩展
一. 机架感知介绍
hadoopV2版本中使用副本冗余的方式实现数据可靠性,在访问Hadoop HDFS集群时,访问速度直接受到Datanode选取策略的影响。Hadoop HDFS提供了一种Rack Awareness机制,以便于粗略计算Client到Datanode的访问开销。如下图,常见的hdfs NetworkTopology三层结构:“
Rack Awareness原理:在Namenode上维护一个树状数据结构的NetworkTopology对象,用来映射Rack、Datanode之间的关系,当Client通过Namenode访问Datanode时,通过一定的策略计算得到访问各个Replication所在Datanode的“距离”。因为我们总是会“认为”跨网段、跨Rack访问是会消耗更多的带宽资源、导致更大的访问延时的。
上图示例中有两种节点,Innernode和Datanode,其中Innernode可以是root节点,可以是Datacenter、也可以是Rack,代表着所有非数据实体(switch/router)的节点,Innernode的特点是它所有的叶子节点都是Datanode;Datenode的特点是它没有子树或者自己的叶子节点,它本身只能是叶子节点。
二. HDFS读写访问机制
HDFS的写访问机制:
在访问者client对HDFS进行写访问时,执行如下原则:
副本数 = 1时:
- 首先挑选与client相同Host的Datanode进行写操作;
- 如果没有,则挑选相同Rack的Datanode;
- 如果再没有,则随机挑选一个Datanode;
副本数 = 2时:
- 第一个副本按照以上原则选取Datanode进行写操作;
- 第二个副本选取一个与第一副本不同Rack的Datanode进行写操作;
副本数 = 3时:
- 第一、第二副本按照以上原则选取Datanode;
- 第三个副本选取与第一个副本同Rack的不同Datanode进行写操作;
副本数 >= 4时:
- 前三个副本按照以上原则选取Datanode;
- 从第四个副本开始,随机选取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的算法是:
- 与clientMachine同Host的Datanode,weight = 0;
- 与clientMachine不同Host,但是同Rack的Datanode,weight = 2;
- 与clientMachine不同Rack的Datanode,weight = 4;
——实际上就是client到目标Datanode路径长度,如果NetworkTopology类实现了Datacenter,那么对不同Datacenter的Datanode,weight = 6;
三. 机架感知实现
3.1 Java类直接静态解析
由core-site.xml中的 net.topology.node.switch.mapping.impl字段指定一个自定义实现DNSToSwitchMapping接口类的类:
一个简单例子:
public class JavaTestBasedMapping implements DNSToSwitchMapping { //key:ip value:rack private static ConcurrentHashMap<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 public List<String> resolve(List<String> names) { List<String> m = new ArrayList<String>(); 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文件相应的字段修改如下:
<property><name>topology.node.switch.mapping.impl</name><value>com.dmp.hadoop.cluster.topology.JavaTestBasedMapping</value>
</property>
3.2 Java调用外部脚本解析mappingFile
HDFS默认使用的是内置的 org.apache.hadoop.net.ScriptBasedMapping 类,用来调用外部脚本来解析net.topology.script.file.name字段指定的数据文件。
以下是官方文档给出的bash脚本和数据文件示例:
#!/bin/bash
#mapping.sh
HADOOP_CONF=/etc/hadoop/conf while [ $# -gt 0 ] ; donodeArg=$1exec< ${HADOOP_CONF}/topology.data result="" while read line ; doar=( $line ) if [ "${ar[0]}" = "$nodeArg" ] ; thenresult="${ar[1]}"fidone shift if [ -z "$result" ] ; thenecho -n "/default/rack "elseecho -n "$result "fi
done
dataFile: mapping.data
hadoopdata1.ec.com /dc1/rack1
hadoopdata1 /dc1/rack1
10.1.1.1 /dc1/rack2
core-site.xml文件相应的字段修改如下:
<property><name>topology.node.switch.mapping.impl</name><value>org.apache.hadoop.net.ScriptBasedMapping</value>
</property>
<property><name>net.topology.script.file.name</name><value>mapping.sh</value>
</property>
3.3基于配置文件的静态解析
HDFS内置的类org.apache.hadoop.net.StaticMapping实现了对core-site.xml
hadoop.configured.node.mapping配置项定义的主机/rack映射关系的解析,相关配置项的格式为:
<property><name>topology.node.switch.mapping.impl</name><value>org.apache.hadoop.net.StaticMapping</value>
</property>
<property><name>hadoop.configured.node.mapping</name><value>192.168.6.10=/rack1,192.168.6.11=/rack2</value>
</property>
3.4TableMapping解析
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类调用脚本解析。
四.机架感知扩展
可以做一些工作来优化HDFS的读取流程,因为在很多情况下,HDFS的用户在物理上是跟Datanode节点同一网段的,这样可以视作是同一个Rack,而因为代表用户的ClientMachine没有Rack信息,在NetworkTopology中会被视作与所有Datanode不同Rack,这显然是不合理的,通过阅读源码,发现DatanodeManager类中有对非Datanode的节点Rack信息的处理,所以,可以考虑把clientMachine引入NetworkTopology,但不归入Datanode,同样作为叶子节点参与路径长度weight的计算,这样就能够更加科学的对包含数据副本的Datanode进行排序,实现读速度优化的目标。这里就不贴源码献丑了。
另外,还可以对通过修改net.topology.impl改变Hadoop使用的NetworkTopology工具类,自己设计构造网络拓扑结构的算法,实现对具体场景下HDFS文件读访问的优化。
HDFS Rack Awareness详解相关推荐
- HDFS NameNode内存详解
前言 <HDFS NameNode内存全景>中,我们从NameNode内部数据结构的视角,对它的内存全景及几个关键数据结构进行了简单解读,并结合实际场景介绍了NameNode可能遇到的问题 ...
- HDFS 基础部分详解
精选30+云产品,助力企业轻松上云!>>> 上一篇文章 Hadoop 系列之 1.0和2.0架构 中,提到了 Google 的三驾马车,关于分布式存储,计算以及列式存储的论文,分别对 ...
- HDFS Federation与HDFS High Availability详解
HDFS Federation NameNode在内存中保存文件系统中每个文件和每个数据块的引用关系,这意味着对于一个拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈.在2.0发行版本系列 ...
- hdfs 备份数配置_大数据||HDFS HA配置详解
根据HA架构图,规划HA的分布式集群服务器 HA集群规划 配置参考图 根据官方文档配置HA 部分说明 Architecture 在典型的ha集群中,两台独立的机器被配置为namenode.在任何时间点 ...
- Hadoop生态圈(十六)- HDFS Snapshot快照详解
目录 前言 1. Snapshot快照 1.1 快照介绍和作用 1.1.1 数据恢复 1.1.2 数据备份 1.1.3 数据测试 1.2 HDFS快照的实现 1.3 快照的命令 1.3.1 快照功能启 ...
- hdfs balancer 源程序详解
最近集群存储倾斜,个别节点存储超过85%,启动balancer之后效果明显,但是有时候balancer启动也不能解决问题.从运维阶段就知道有这么一个balancer,今天终于憋了一口气看看balanc ...
- HDFS文件目录结构详解
Namenode中主要存储fsimage和editlog文件,Datanode中主要存储数据块blk文件.下面分别介绍Namenode和Datanode中的文件存储结构. 文章目录 1 Namenod ...
- Flume HDFS Sink配置详解
Name Default Description channel – type – 组件的名称,必须为:HDFS hdfs.path – HDFS目录路径,例如:hdfs://namenode/f ...
- 【收藏】hdfs参数配置详解
hdfs-site.xml 配置参数 hdfs-site.xml 参数配置
- HDFS(下):NameNode和SecondaryNameNode、HDFS工作机制、故障处理、集群安全模式、服役退役节点、集群黑白名单、DataNode多目录详解、HDFS2.x新特性
接上篇,上篇文章传送门:HDFS(上):HDFS优缺点.HDFS操作.HDFS客户端操作.HDFS的API.HDFS数据流.HDFS的IO流.HDFS读写数据流程.HDFS文件处理详解.windows ...
最新文章
- 一本读懂BERT(实践篇)重点
- python如何返回多个值_python- 如何返回多个值 | 学步园
- 生物学专业_北京交通大学617生物化学20082011历年考研专业课真题汇编
- sqrt开平方算法解析
- oracle ref游标用法,[置顶] Oracle 参照游标(SYS_REFCURSOR)使用
- Android之手机摇一摇震动刷新(支持ListView、GridView、WebView)并生成我的二维码
- oracle如何在本地建库,oracle在本地建库
- IOS – OpenGL ES 调节图像色度 GPUImageHueFilter
- springMVC实现的crud操作
- 1、使用xcode9创建swift语言的第一个程序hello world
- ijkplayer 自定义解码器
- matlab刻度字体,matlab 设置横纵坐标刻度的字体!!
- 关于计算机分类 按用途可以分为,计算机的分类一般分为
- WRF4.2安装过程全记录
- 问题日志-简易css时间轴特效
- 公司女同事深夜11点让我去她住处修电脑,原来是C盘爆红,看我一招搞定女同事....的电脑
- Unity 打包项目发红
- springboot 启动 ApplicationContext applicationContext = null
- 5s注销了id新建id服务器出错,iphone5s手机如何重新设置苹果id账户
- 计算机考研英语听力,英语听力_2017考研常识:计算机考研必知_沪江英语
热门文章
- jsp+css实现图片自动轮换
- 安装了vmWare15,打开虚拟机时,电脑总是重启,怎么办?
- Mini MP3 Player播放器简介与STC12例程
- 英语口语收集(十六)
- lookup无序查找_数据查找之LOOKUP篇(一):LOOKUP函数解析
- 【Nodejs】使用http.request批量下载MP3,发现网络文件大于1000K时下载文件为0K
- 如何看待360与腾讯之争
- 马虎词汇教程1-5(转载)
- ubuntu如何杀进程_ubuntu kill进程
- 【问题记录】pip 安装报错 Failed to establish a new connection