设为首页 收藏本站
查看: 1743|回复: 0

[经验分享] Hadoop学习--机架感知--day05

[复制链接]

尚未签到

发表于 2018-10-29 10:02:05 | 显示全部楼层 |阅读模式
  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" ] ; then10       result="${ar[1]}"11     fi12   done 13   shift 14   if [ -z "$result" ] ; then15     echo -n "/default/rack "16   else17     echo -n "$result "18   fi19 done

  topology.data文件格式如下:

tt156   /dc1/rack1  
tt163   /dc1/rack1
  
tt164   /dc1/rack2
  
tt165   /dc1/rack210.32.11.156   /dc1/rack110.32.11.163   /dc1/rack110.32.11.164   /dc1/rack210.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 resolve(List names) { 9         names = NetUtils.normalizeHostNames(names);10 11         List  result = new ArrayList(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”文件中的配置如下:  

  
  topology.node.switch.mapping.impl
  
  org.apache.hadoop.net.MyResolveNetworkTopology
  
   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.  

  以上两种方法在配置完成后,会在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类的方式性能较高,但是编译之后就无法改变了,所以灵活程度较低。所以要根据具体情况来选择策略.



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627845-1-1.html 上篇帖子: Hadoop学习--测试压缩--day05 下篇帖子: Hadoop学习--int类型的序列化和反序列化--day07
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表