1. 程式人生 > 實用技巧 >Hadoop基礎之機架感知

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