hadoop中的机架感知

每个IP 对应的机架ID都是 /default-rack ,说明hadoop的机架感知没有被启用。

要将hadoop机架感知的功能启用,配置非常简单,在 NameNode所在节点的/home/bigdata/apps/hadoop/etc/hadoop的core-site.xml配置文件中配置一个选项:

<property>
  <name>topology.script.file.name</name>
  <value>/usr/hadoop/etc/hadoop/topology.sh</value>
</property>

  namenode会根据配置寻找该脚本,并在接收到每一个datanode的heartbeat时,将该datanode的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode所属的机架ID,保存到内存的一个map中.

 一个简单的实现如下:

#!/bin/bash
HADOOP_CONF=/usr/hadoop/etc/hadoop
while [ $# -gt 0 ] ; do
  nodeArg=$1
  exec<${HADOOP_CONF}/topology.data
  result=""
  while read line ; do
    ar=( $line )
    if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]; then
      result="${ar[2]}"
    fi
  done
  shift
  if [ -z "$result" ] ; then
    echo -n "/default-rack"
  else
    echo -n "$result"
  fi
  done

topology.data,格式为:节点(ip或主机名) /交换机xx/机架xx

10.18.51.52   master.hadoop    /dc1/rack1
10.18.51.53   slave1.hadoop    /dc1/rack1
10.18.51.54   slave2.hadoop    /dc1/rack1
10.18.51.55   slave3.hadoop    /dc1/rack1
10.18.51.56   slave4.hadoop    /dc1/rack1
10.18.51.57   slave5.hadoop    /dc1/rack2
10.18.51.58   slave6.hadoop    /dc1/rack2
10.18.51.59   slave7.hadoop    /dc1/rack2
10.18.51.60   slave8.hadoop    /dc1/rack2

需要注意的是,在Namenode上,该文件中的节点必须使用IP,使用主机名无效,而Jobtracker上,该文件中的节点必须使用主机名,使用IP无效,所以,最好ip和主机名都配上。

这样配置后,namenode启动时候日志是这样的:

2013-09-23 17:16:27,272 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node:  /dc1/rack3/  192.168.147.94:50010

说明hadoop的机架感知已经被启用了。

查看HADOOP机架信息命令:  
./hadoop dfsadmin -printTopology 

Rack: /dc1/rack1
   192.168.147.91:50010 (tbe192168147091)
   192.168.147.92:50010 (tbe192168147092)
posted @ 2016-05-08 20:07  大脸猫951  阅读(414)  评论(0编辑  收藏  举报