hadoop配置机架感知
接着上一篇来说。上篇说了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配置机架感知的更多相关文章
- 深入理解hadoop之机架感知
深入理解hadoop之机架感知 机架感知 hadoop的replication为3,机架感知的策略为: 第一个block副本放在和client所在的datanode里(如果client不在集群范围内, ...
- 【Hadoop】Hadoop 机架感知配置、原理
Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地 ...
- 【转载】Hadoop机架感知
转载自http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html 背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机 ...
- hadoop机架感知
背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...
- 【原创】Hadoop机架感知对性能调优的理解
Hadoop作为大数据处理的典型平台,在海量数据处理过程中,其主要限制因素是节点之间的数据传输速率.因为集群的带宽有限,而有限的带宽资源却承担着大量的刚性带宽需求,例如Shuffle阶段的数据传输不可 ...
- ZooKeeper学习之路 (十)Hadoop的HA集群的机架感知
一.背景 Hadoop 的设计目的:解决海量大文件的处理问题,主要指大数据的存储和计算问题,其中, HDFS 解决数据的存储问题:MapReduce 解决数据的计算问题 Hadoop 的设计考虑:设计 ...
- hadoop之 hadoop 机架感知
1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份.这样如果本地数据损坏,节点可以从同一机 ...
- 第十三章 hadoop机架感知
背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...
- Apache Hadoop集群安装(NameNode HA + SPARK + 机架感知)
1.主机规划 序号 主机名 IP地址 角色 1 nn-1 192.168.9.21 NameNode.mr-jobhistory.zookeeper.JournalNode 2 nn-2 ).HA的集 ...
随机推荐
- 前端中sprite.png的实现
通过background-position来控制X轴和Y轴,从而实现显示sprite.png中想要的ico或图案. 如下图所示:
- js设计模式总结-策略模式
策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...
- 解决magento后台无法登陆/登陆没有反应的方法
安装过magento的几个版本,安装好后在登陆后台的时候都遇到了点问题,用户名和密码都输入正确,就是登陆不了后台,经过研究发现,登陆不了后台的主要是因为magento自身缓存设置的问题,最模板解决方法 ...
- 进fastreboot
1.红米1s 关机后,开机键+音量键下 同时按 2.红米note 关机后,开机键+音量键上 同时按 3. 4. 5.
- js判断当前设备
最近用bootstrap做自适应,发现仍然很难很好的兼容web端和PC端的现实. 仔细观察百度,淘宝,京东等大型网站,发现这些网站都有对应不同客户端的子站. 例如: 站点 PC端url web端url ...
- java时间段分成小段存储
package testThread; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...
- Spring的xml文件配置方式实现AOP
配置文件与注解方式的有很大不同,多了很多配置项. beans2.xml <?xml version="1.0" encoding="UTF-8"?> ...
- MIT牛人解说数学体系
https://www.douban.com/group/topic/11115261/ 在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进. 为什 ...
- ubuntu-kylin16.04搭建lamp环境。
首先下载安装apache2 输入:sudo apt-get install apache2 安装完毕后,在浏览器中输入:localhost 显示如下图,说明安装正确. 紧接着安装php7.0 输入:s ...
- cmd 常用指令
d: 进入d盘 cd xxx 进入某个目录