Hadoop3.x 机架感知机制与配置

目录

什么是机架感知

感知hadoop集群中每个机器节点所属的机架

如何感知机架

某台 slave 机器是属于哪个 rack 并非是智能感知的,而是需要 hadoop的管理者人为的告知 hadoop 哪台机器属于哪个 rack,这样在 hadoop的 namenode 启动初始化时,会将这些机器与 rack 的对应信息保存在内存中,用来作为对接下来所有的 HDFS 的写块操作分配 datanode列表时(比如 3 个 block 对应三台 datanode)的选择 datanode 策略,尽量将三个副本分布到不同的 rack。

Hadoop机架感知的作用

不开启机架感知的缺点

默认情况下,hadoop 的机架感知是没有被启用的。所以,在通常情况下,hadoop 集群的 HDFS 在选机器的时候,是随机选择的。
也就是说,如果实际节点不完全在相同的机架,但是又没有配置机架感知很有可能在写数据时:
hadoop 将第一块数据 block1 写到了rack1 上,然后随机的选择下将 block2 写入到了 rack2 下,此时两个rack 之间产生了数据传输的流量,再接下来,在随机的情况下,又将block3 重新又写回了 rack1,此时,两个 rack 之间又产生了一次数据流量。在 job 处理的数据量非常的大,或者往 hadoop 推送的数据量非常大的时候,这种情况会造成 rack 之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能以至于整个集群的服务。

开启机架感知的优势

(1)不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架;
(2)为了提高容错能力,名称节点会尽可能把数据块的副本放到多个机架上。

默认3副本情况下:

  1. client所在节点如果是DataNode节点,那么会在本节点存放一份副本;如果client在集群外,那么按照就近原则选一个节点存放副本;
  2. 第二个副本在另外一个机架的随机一个节点;
  3. 第三个副本在第二个副本所在机架的随机一个节点;

在这里插入图片描述

如何配置机架感知?

1.检查当前集群机架配置情况

  • 执行hdfs dfsadmin -printTopology打印当前机架信息,可以看到默认所有节点都是一个机架 default-rack,此时没有配置机架感知。

    Rack: /default-rack
    172.16.91.102:9866 (hadoop102)
    172.16.91.103:9866 (hadoop103)
    172.16.91.104:9866 (hadoop104)


2.自定义机器机架位置

  • 新建机架配置文件topology.data

    vim $HADOOP_HOME/topology.data

由于由于官方配置文件没有确切的说明到底是主机名还是 ip 地址会被传入到脚本,所以在脚本中最好兼容主机名和 ip 地址。

172.16.91.102  hadoop102        /switch1/rack1
172.16.91.103  hadoop103        /switch1/rack1
172.16.91.104  hadoop104        /switch1/rack2

3.自定义机架感知脚本

  • 在Hadoop的安装目录下新建脚本topology.sh

    vim $HADOOP_HOME/topology.sh

  • 编写脚本内容

脚本参考的一位大佬的,上面的注释是我加上去的方便理解脚本作用,大家也可以自己写,只要符合入参、出参要求就可以。

#!/bin/bash
# 此处是你的机架配置文件topology.sh所在目录
HADOOP_CONF=/opt/module/hadoop-3.1.3
while [ $# -gt 0 ] ;
do
        #脚本第一个参数节点ip或者主机名称赋值给nodeArg
        nodeArg=$1
        #以只读的方式打开机架配置文件
        exec<${HADOOP_CONF}/topology.data
        #声明返回值临时变量
        result=""
        #开始逐行读取
        while read line
        do
                #赋值行内容给ar,通过这种 变量=( 值 )的方式赋值,下面可以通过数组的方式取出每个词
                ar=( $line )
                #判断输入的主机名或者ip是否和该行匹配
                if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]
                then
                        #将机架信息赋值给result
                        result="${ar[2]}"
                fi
        done
        shift
        #-z判断字符串长度是否为0,不为0输出实际机架,为0返回默认机架信息
        if [ -z "$result" ]
        then
                echo -n "/default-rack"
        else
                echo -n "$result"
        fi
done

4.配置core-site.xml文件机架感知

实测脚本必须添加可执行权限,可以使用 [chmod 777 topology.sh]的方式添加权限

<!-- 配置机架感知配置脚本  -->
<property>
        <name>net.topology.script.file.name</name>
        <value>/opt/module/hadoop-3.1.3/topology.sh</value>
         <!-- 注意这里是你脚本的实际位置 -->
 </property>

5.验证机架感知配置

  • 重启集群,执行hdfs dfsadmin -printTopology打印机架信息,可以看到集群已经按照配置感应到节点机架位置。

    Rack: /switch1/rack1
    172.16.91.102:9866 (hadoop102)
    172.16.91.103:9866 (hadoop103)

    Rack: /switch1/rack2
    172.16.91.104:9866 (hadoop104)

  • 测试上传文件,因为只搭建了三个节点,因此设置副本数为2,查看两个副本是否存在不同的机架rack1和rack2上的节点。
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值