背景
“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;
总结一下,两台机器间的距离就是两台主机到相同节点的交换机的距离的和。