Hadoop 机架感知理解 和 配置实现

什么是机架感知?

机架感知简单的讲 就是告诉集群各个从节点所在的机架。方便集群更有效率的存储数据、利用资源。

默认的副本存储策略:

首选在本地机架的一个node存放副本,另一个副本在本地机架的另一个不同节点。
最后一个副本在不同机架的不同节点上。

 怎么告诉集群?

Hadoop 并没有那么智能,知道各个从节点所在的机架。

主要管理员手动的去配置。如果不配置,它会生成一个 default-rack.xml ,认为所有的 DataNode 的节点在一个机架上。

如何配置呢? 

下面我们将以 3 台从节点为例:

它们分别是:s102  s103  s104

  1. 自定义类实现 DNSToSwitchMapping,重写 resolve() 方法;打为 jar 包,并复制到 NameNode 节点的 /soft/hadoop/shared/hadoop/common/lib 目录下
    1. /**
       * 机架感知类
       */
      public class MyRackAware implements DNSToSwitchMapping {
          /**
           * 根据需求,将不同的主机划分到不同的机架上
           * @param names 数据节点主机的集合
           * @return 机架感知的集合
           */
          public List<String> resolve(List<String> names) {
              List<String> list = new ArrayList<String>();
              try {
                  //将原始信息输出到目录,方便查看
                  FileWriter fw = new FileWriter("/home/centos/rackaware.txt");
                  for (String host : names) {
                      //将输入的原始host写入文件
                      fw.append(host+"/r/n");
      
                      //进行原始的host进行分机架
                      // IP形式
                      if (host.startsWith("192")) {
                          String ipEnd = host.substring(host.lastIndexOf(".") + 1);
                          if (Integer.parseInt(ipEnd) <= 103) { //s102,s103 在一个机架
                              list.add("/rack1/" + ipEnd);
                          } else {                              //s104 在一个机架
                              list.add("/rack2/" + ipEnd);
                          }
                      }
                      //主机名形式
                      else if (host.startsWith("s")) {
                          String ipEnd = host.substring(1);
                          if (Integer.parseInt(ipEnd) <= 103) { //s102,s103 在一个机架
                              list.add("/rack1/" + ipEnd);
                          } else {                              //s104 在一个机架
                              list.add("/rack2/" + ipEnd);
                          }
                      }
                  }
                  fw.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
              return list;
          }
      
          public void reloadCachedMappings() {
      
          }
      
          public void reloadCachedMappings(List<String> names) {
      
          }
      }
      

       

  2. 配置 core-site.xml 的 net.topology.node.switch.mapping.impl 属性,并分发到各个节点
    1. <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
      		<property>
      				<name>fs.defaultFS</name>
      				<value>hdfs://192.168.37.101/</value>
      		</property>
      		<property>
      				<name>hadoop.tmp.dir</name>
      				<value>/home/centos/hadoop</value>
      		</property>
      		<property>
      				<name>net.topology.node.switch.mapping.impl</name>
      				<value>com.fresher.hdfs.rackaware.MyRackAware</value>
      		</property>
      
      </configuration>

       

  3. 重启集群即可

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值