zoukankan      html  css  js  c++  java
  • hadoop配置机架感知

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

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

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

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

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

     1 HADOOP_CONF=/etc/hadoop/conf 
     2 
     3 while [ $# -gt 0 ] ; do  //$#代表执行命令时输入的参数个数
     4   nodeArg=$1
     5   exec< ${HADOOP_CONF}/topology.data   //读入文件
     6   result="" 
     7   while read line ; do        //循环遍历文件内容
     8     ar=( $line ) 
     9     if [ "${ar[0]}" = "$nodeArg" ] ; then
    10       result="${ar[1]}"
    11     fi
    12   done 
    13   shift 
    14   if [ -z "$result" ] ; then
    15     echo -n "/default/rack "
    16   else
    17     echo -n "$result "
    18   fi
    19 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()方法来完成转换了。我写的比较简单,能完成功能就好,代码如下(大神飞过):

     1 public class MyResolveNetworkTopology implements DNSToSwitchMapping {
     2 
     3     private String[] hostnameLists = {"tt156", "tt163", "tt164", "tt165"};
     4     private String[] ipLists = {"10.32.11.156", "10.32.11.163", "10.32.11.164", "10.32.11.165"};
     5     private String[] resolvedLists = {"/dc1/rack1", "/dc1/rack1", "/dc1/rack2", "/dc1/rack2"};
     6     
     7     @Override
     8     public List<String> resolve(List<String> names) {
     9         names = NetUtils.normalizeHostNames(names);
    10 
    11         List <String> result = new ArrayList<String>(names.size());
    12         if (names.isEmpty()) {
    13           return result;
    14         }
    15 
    16         for (int i = 0; i < names.size(); i++) {
    17             String name = names.get(i);
    18             for(int j = 0; j < hostnameLists.length; j++){
    19                 if(name.equals(hostnameLists[j])) {
    20                     result.add(resolvedLists[j]);
    21                 } else if(name.equals(ipLists[j])) {
    22                     result.add(resolvedLists[j]);
    23                 }
    24             }
    25         }
    26         return result;
    27     }
    28 }

      我把这个自定义的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

  • 相关阅读:
    [转] ORACLE 错误编号表一
    基于CkEditor实现.net在线开发之路(1)
    跨行清算系统的实现原理
    应用程序域
    支付机构客户备付金存管办法
    数据库培训二期试题
    MYSQL开发规范
    详解线上线下收单业务(一)第三方支付
    Solr安装配置说明
    进程(Process)
  • 原文地址:https://www.cnblogs.com/gwgyk/p/4531947.html
Copyright © 2011-2022 走看看