背景
“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;
总结一下,两台机器间的距离就是两台主机到相同节点的交换机的距离的和。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦