接着上一篇来说。上篇说了hadoop网络拓扑的构成及其相应的网络位置转换方式,本篇主要讲通过两种方式来配置机架感知。一种是通过配置一个脚本来进行映射;另一种是通过实现DNSToSwitchMapping接口的resolve()方法来完成网络位置的映射。

  hadoop自身是没有机架感知能力的,必须通过人为的设定来达到这个目的。在FSNamesystem类中的resolveNetworkLocation()方法负载进行网络位置的转换。其中dnsToSwitchMapping变量代表了完成具体转换工作的类,其值如下:

 this.dnsToSwitchMapping = ReflectionUtils.newInstance(
conf.getClass("topology.node.switch.mapping.impl", ScriptBasedMapping.class,
DNSToSwitchMapping.class), conf);

  也就是说dnsToSwitchMapping的值由“core-site.xml”配置文件中的"topology.node.switch.mapping.impl"参数指定。默认值为ScriptBasedMapping,也就是通过读提前写好的脚本文件来进行网络位置映射的。但如果这个脚本没有配置的话,那就使用默认值“default-rack”作为所有结点的网络位置。

  下面就先说说第一种配置机架感知的方法,使用脚本来完成网络位置的映射。这需要在“core-site.xml”配置文件中的“topology.script.file.name”参数中指定脚本文件的位置。在wiki上找到一个官方的配置脚本,可以参考一下。首先是shell脚本:

 HADOOP_CONF=/etc/hadoop/conf 

 while [ $# -gt  ] ; do  //$#代表执行命令时输入的参数个数
nodeArg=$
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

  topology.data文件格式如下:

tt156   /dc1/rack1
tt163 /dc1/rack1
tt164 /dc1/rack2
tt165 /dc1/rack2
10.32.11.156 /dc1/rack1
10.32.11.163 /dc1/rack1
10.32.11.164 /dc1/rack2
10.32.11.165 /dc1/rack2

  我是把原来topology.data文件内容改了下,把hostname也添加进去了,这样保证正确性。因为JobTracker是通过hostname进行映射的。

  网上也有用Python脚本和C语言写的,但我对Python不是很熟,所以在这里就不说了。总结上边的内容,可以知道,不管用什么脚本来写,最重要的就是接收参数,完成网络位置映射并将结果输出。这样系统就能够接收到合适结果。

  

  第二种配置机架感知的方法是通过实现DNSToSwitchMapping接口,重写resolve()方法完成的。这就需要自己写个java类来完成映射了。然后在“core-site.xml”配置文件中的“topology.node.switch.mapping.impl”指定自己的实现类。这样的话,在进行网络位置解析的时候,就会调用自己类中的resolve()方法来完成转换了。我写的比较简单,能完成功能就好,代码如下(大神飞过):

 public class MyResolveNetworkTopology implements DNSToSwitchMapping {

     private String[] hostnameLists = {"tt156", "tt163", "tt164", "tt165"};
private String[] ipLists = {"10.32.11.156", "10.32.11.163", "10.32.11.164", "10.32.11.165"};
private String[] resolvedLists = {"/dc1/rack1", "/dc1/rack1", "/dc1/rack2", "/dc1/rack2"}; @Override
public List<String> resolve(List<String> names) {
names = NetUtils.normalizeHostNames(names); List <String> result = new ArrayList<String>(names.size());
if (names.isEmpty()) {
return result;
} for (int i = 0; i < names.size(); i++) {
String name = names.get(i);
for(int j = 0; j < hostnameLists.length; j++){
if(name.equals(hostnameLists[j])) {
result.add(resolvedLists[j]);
} else if(name.equals(ipLists[j])) {
result.add(resolvedLists[j]);
}
}
}
return result;
}
}

  我把这个自定义的MyResolveNetworkTopology类放在了core包的org.apache.hadoop.net目录下。所以在“core-site.xml”文件中的配置如下:  

<property>
<name>topology.node.switch.mapping.impl</name>
<value>org.apache.hadoop.net.MyResolveNetworkTopology</value>
<description> The default implementation of the DNSToSwitchMapping. It
invokes a script specified in topology.script.file.name to resolve
node names. If the value for topology.script.file.name is not set, the
default value of DEFAULT_RACK is returned for all node names.
</description>
</property>

  以上两种方法在配置完成后,会在NameNode和JobTracker的log中打印出如下信息:

2015-05-26 20:47:20,665 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /dc1/rack1/tt163
2015-05-26 20:47:20,689 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /dc1/rack1/tt156
.......

  这就说明机架感知配置成功了。

  总结一下以上两种方式。通过脚本配置的方式,灵活性很高,但是执行效率较低。因为系统要从jvm转到shell去执行;java类的方式性能较高,但是编译之后就无法改变了,所以灵活程度较低。所以要根据具体情况来选择策略.

  本文基于hadoop1.2.1。如有错误,还请指正

  参考文章:http://wiki.apache.org/hadoop/topology_rack_awareness_scripts

  转载请注明出处:http://www.cnblogs.com/gwgyk/p/4531947.html

hadoop配置机架感知的更多相关文章

  1. 深入理解hadoop之机架感知

    深入理解hadoop之机架感知 机架感知 hadoop的replication为3,机架感知的策略为: 第一个block副本放在和client所在的datanode里(如果client不在集群范围内, ...

  2. 【Hadoop】Hadoop 机架感知配置、原理

    Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地 ...

  3. 【转载】Hadoop机架感知

    转载自http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html 背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机 ...

  4. hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

  5. 【原创】Hadoop机架感知对性能调优的理解

    Hadoop作为大数据处理的典型平台,在海量数据处理过程中,其主要限制因素是节点之间的数据传输速率.因为集群的带宽有限,而有限的带宽资源却承担着大量的刚性带宽需求,例如Shuffle阶段的数据传输不可 ...

  6. ZooKeeper学习之路 (十)Hadoop的HA集群的机架感知

    一.背景 Hadoop 的设计目的:解决海量大文件的处理问题,主要指大数据的存储和计算问题,其中, HDFS 解决数据的存储问题:MapReduce 解决数据的计算问题 Hadoop 的设计考虑:设计 ...

  7. hadoop之 hadoop 机架感知

    1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份.这样如果本地数据损坏,节点可以从同一机 ...

  8. 第十三章 hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

  9. Apache Hadoop集群安装(NameNode HA + SPARK + 机架感知)

    1.主机规划 序号 主机名 IP地址 角色 1 nn-1 192.168.9.21 NameNode.mr-jobhistory.zookeeper.JournalNode 2 nn-2 ).HA的集 ...

随机推荐

  1. yum安装命令的使用方法

    yum安装常用软件的命令 #yum check-update #yum remove 软件包名 #yum install 软件包名 #yum update 软件包名 yum命令常见使用方法 yum - ...

  2. Cheatsheet: 2016 05.01 ~ 05.31

    Other Awesome Go - A curated list of awesome Go frameworks, libraries and software Visual Studio Cod ...

  3. Grunt_1从安装开始创建一个基本的Grunt

    Grunt的介绍:http://www.gruntjs.net/getting-started 文件架构:https://github.com/zhangsai521314/Grunt 1:安装Git ...

  4. C++ int与string的转化

    int本身也要用一串字符表示,前后没有双引号,告诉编译器把它当作一个数解释.缺省情况下,是当成10进制(dec)来解释,如果想用8进制,16进制,怎么办?加上前缀,告诉编译器按照不同进制去解释.8进制 ...

  5. 第一次写Web API接口

    API是什么?只知道是网络接口,具体怎么写?不会!如何调用?不会!那怎么办? 第一次的经历~~ 需求:为其他项目提供一个接口 功能:为项目提供询盘信息和商家信息,格式为Json字符串 拿过来,就开始做 ...

  6. PHP data

  7. python3 密码生成器

    用random模块实现按照要求生成一定个数和一定位数的密码: #Author by Andy #_*_ coding:utf-8 _*_ import random checkcode='' code ...

  8. git 提交代码到github错误处理

    git push -u origin mastererror: The requested URL returned error: 403 Forbidden while accessing http ...

  9. windows7 64,32位下scrapy爬虫框架的环境搭建

    适用于python 2.7 64位安装 一.操作系统:WIN7 64位 二.python版本:2.7 64位(scrapy目前不支持3.x) 不确定位数的,看图 三.安装相关软件:(可以从我的百度网盘 ...

  10. loadrunner关联——对服务器返回的数据选择性提交

    在跟进项目的过程中,才体会到自己之前闷头看书再写小小的测试程序验证的学习方式很没有效率,知道动态关联,却也只是会参数化式的动态关联,这种关联是我们预先知道要提交的数据而进行的关联:更高一级的可能就是使 ...