hadoop配置机架感知,原理

背景

“hadoop权威指南”里面有说明,配置机架感知的目的就是要最大程度发挥hadoop的性能,要做到这点就是知道hadoop集群的网络拓扑结构(it knows the topology of your network)。如果集群中的机器都跑在一个机架上,那么我们什么都不用做,集群下的节点默认都是在“/default-rack”下的,可以启动hadoop集群的时候查看logs/namenode.log

2018-06-13 09:23:25,115 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /default-rack/192.168.1.214:50010
2018-06-13 09:23:25,304 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /default-rack/192.168.1.211:50010
//...
//发现每个几点启动的时候,都是默认在"default-rack"机架下面,后面跟机器的ip地址

hadoop知道网络的拓扑结构之后会怎么样呢?hadoop会智能的放置分片,根据节点之间的距离,本节点会放置一份副本同机架上另外节点会放置一份副本,另外一个机架上回放置一份副本。默认情况下用户自定义脚本来配置网络拓扑结构,通过修改“core-site.xml”中“net.topology.script.file.name”的value是脚本的名字。

编写脚本

#!/bin/bash
#配置文件路径
HADOOP_CONF=/home/hadoop/hadoop/etc
#判断参数的个数 > 0
while [ $# -gt 0 ] ; do
    nodeArg=$1
    # exec <file 将file中的内容作为exec的标准输入
    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
    #判断字符串长度是否为0
    if [ -z "$result" ] ; then
        echo -n "/default-rack"
    else
        echo -n "$result"
    fi
done

查看namenode.log

2018-06-13 10:52:17,004 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /dc1/rack1/192.168.1.210:50010
//...

查看网络拓扑结构

//输入命令
hdfs dfsadmin -printTopology

Rack: /dc1/rack1
   192.168.1.210:50010 (es01)
   192.168.1.211:50010 (es02)

Rack: /dc1/rack2
   192.168.1.212:50010 (es03)
   192.168.1.213:50010 (es04)

Rack: /dc1/rack3
   192.168.1.214:50010 (es05)

增加数据节点

要修改topology.data,然后启动数据节点。

计算节点间的距离

同一机架下的主机A和B,比如/dc1/rack1/ipA,/dc1/rack1/ipB,距离是A到机架rack1交换机的距离1加上B到机架rack1交换机的距离1得结果2;同一数据中心dc下的不同机架下的两台主机A和C,比如/dc1/rack1/ipA,/dc1/rack2/ipC,距离是A到数据中心dc1的交换机距离2加上B到数据中心dc1的交换机距离2得到结果4;

总结一下,两台机器间的距离就是两台主机到相同节点的交换机的距离的和。

阅读更多
个人分类: hadoop
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭