Hadoop基础之机架感知
Hadoop基础之机架感知
什么是机架感知
- 机架:存放服务器的架子,也叫机柜。一般来说一个机房有很多机柜,每个机柜有很多服务器
感知策略
- Hadoop1版本
- 客户端依据最近空闲原则选择一个节点,在不同机架上选择第二个节点,在第二个节点的同机架下选择第三个节点
- Hadoop2版本
- 客户端依据最近空闲选择一个节点,在当前节点同机架下原则第二个节点,在不同节点上选择第三个节点
物理机架与逻辑机架
- 物理机架:一个机架里的服务器属于一个机架
- 逻辑机架:接在同一个交换机上的所有节点属于一个机架
Hadoop中怎么实现机架感知
- 查看机架的分配
- 查看拓扑结构:hdfs dfsadmin -printTopology
- 时间机架感知的几种情况
- core-site.xml或conf.set()指定net.topology.node.switch.mapping.impl按照指定类实现机架感知
package hdfs; import org.apache.hadoop.net.DNSToSwitchMapping; import java.util.ArrayList; import java.util.List; public class RackPerception implements DNSToSwitchMapping { public List<String> resolve(List<String> names) { int ip = 0; String rack = ""; List<String> rackList = new ArrayList<String>(names.size()); for (String name : names) { if(name.startsWith("hadoop")){ ip = Integer.parseInt(name.replace("hadoop","")); }else{ ip = Integer.parseInt(name.substring(name.lastIndexOf(".")+1)); } if(ip == 102 || ip == 104){ rack = "/Violet Evergarden"; }else if (ip == 103){ rack = "/Tifa Lockhart"; }else{ rack = "/other"; } rackList.add(rack); } return rackList; } public void reloadCachedMappings() { } public void reloadCachedMappings(List<String> names) { } // public static void main(String[] args) { // List<String> list = new ArrayList<String>(); // list.add("hadoop102"); // list.add("hadoop103"); // list.add("hadoop104"); // List<String> ra = new RackPerception().resolve(list); // for (String string : ra) { // System.out.println(string); // } // } }
- 没指定自定义类,且net.topology.script.file.name没指定脚本,所有节点都归于/default-rack机架
- 没指定自定义类,且net.topology.script.file.name指定脚本,按照脚本解析
- 方式一
#!/bin/bash
count=$#
if [ ${count} -eq 0 ] ; then
echo "no args"
exit
fi
#获取当前的主机名或ip地址
node=$1
#截取ip或主机名的最后的ip地址
if [ ${node:0:4} == "node" ] ; then
ip=${node:4}
else
ip=${node:12}
fi
#利用截取出来的ip进行判断,分配机架
if [ ${ip} -gt 131 ] && [ ${ip} -le 133 ] ; then
echo "/TifaLockhart"
else
echo "/VioletEvergarden"
fi
- 方式二
topology
#!/bin/bash HADOOP_CONF=/home/bduser/modules/hadoop/etc/hadoop/script while [ $# -gt 0 ] ; do nodeArg=$1 exec< ${HADOOP_CONF}/topology.data result="" while read line ; do ar=( $line ) if [ "${ar[0]}" = "$nodeArg" ] ; then result="${ar[1]}" fi done shift if [ -z "$result" ] ; then echo -n "/default/rack " else echo -n "$result " fi done
topology.data
node132 /TifaLockhart node133 /VioletEvergarden node134 /VioletEvergarden 192.168.162.132 /TifaLockhart 192.168.162.133 /VioletEvergarden 192.168.162.134 /VioletEvergarden
如有问题,请发送邮件至buxiaqingcheng@163.com或者buxiaqingcheng@dingtalk.com