Hadoop基础之机架感知

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
    原文地址:https://www.cnblogs.com/zhenzhunaichabujiatang/p/13969294.html