zoukankan      html  css  js  c++  java
  • 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
    • 相关阅读:
      hive.exec.parallel参数
      MySQL FEDERATED 提示
      mapreduce作业单元测试
      linux 更改mysql的数据库目录
      SQL Server 2008数据库邮件配置及应用
      mysql主键大小写不敏感的解决办法
      java遍历hashMap、hashSet、Hashtable
      Linux下命令行显示当前全路径方法
      通过SQL Server操作MySQL的步骤和方法
      Linux shell获取时间和时间间隔(ms级别)
    • 原文地址:https://www.cnblogs.com/zhenzhunaichabujiatang/p/13969294.html
    Copyright © 2011-2022 走看看