HDFS机架感知「建议收藏」

HDFS机架感知「建议收藏」通常大型 Hadoop 集群是以机架的形式来组织的,同一个机架上的不同节点间的网络状况比不同机架之间的更为理想,NameNode 设法将数据块副本保存在不同的机架上以提高容错性。

HDFS机架感知

Hadoop版本:2.9.2

什么是机架感知

通常大型 Hadoop 集群是以机架的形式来组织的,同一个机架上的不同节点间的网络状况比不同机架之间的更为理想,NameNode 设法将数据块副本保存在不同的机架上以提高容错性。

HDFS 不能够自动判断集群中各个 DataNode 的网络状况情况,Hadoop 允许集群的管理员通过配置 net.topology.script.file.name 参数来确定节点所处的机架,配置文件提供了 ip 到 rackid 的翻译。NameNode 通过这个配置知道集群中各个 DataNode 机器的 rackid。如果 net.topology.script.file.name 没有设定,则每个 ip 都会被翻译成 /default-rack。机器感知如下图所示:

image-20220108190458452

图中的 D 和 R 是交换机,H 是 DataNode,则 H1 的 rackid = /D1/R1/H1,有了 rackid 信息(这些 rackid 信息可以通过 net.topology.script.file.name 配置)就可以计算出任意两台 DataNode 之间的距离。

  • distance(/D1/R1/H1 , /D1/R1/H1) = 0 相同的 DataNode
  • distance(/D1/R1/H1 , /D1/R1/H2) = 2 同 rack 下的不同 DataNode
  • distance(/D1/R1/H1 , /D1/R2/H4) = 4 同 IDC 下的不同 DataNode
  • distance(/D1/R1/H1 , /D2/R3/H7) = 6 不同 IDC 下的 DataNode

说明:

  1. 当没有配置机架信息时,所有的机器 Hadoop 都在同一个默认的机架下,名为 “/defult-rack”,这种情况的任何一台 DataNode 机器,bug物理上是否属于同一个机架,都会被认为是在同一个机架下。
  2. 一旦配置 net.topology.script.file.name,就按照网络拓扑结构来寻找 DataNode:net.topology.script.file.name 这个配置选项的 value 指定为一个可执行程序,通常为一个脚本。

Hadoop机架感知的作用

不开启机架感知的缺点

默认情况下,hadoop 的机架感知是没有被启用的。所以,在通常情况下,hadoop 集群的 HDFS 在选机器的时候,是随机选择的。
也就是说,如果实际节点不完全在相同的机架,但是又没有配置机架感知很有可能在写数据时:

hadoop 将第一块数据 block1 写到了 rack1 上,然后随机的选择下将 block2 写入到了 rack2 下,此时两个 rack 之间产生了数据传输的流量,再接下来,在随机的情况下,又将 block3 重新又写回了 rack1,此时,两个 rack 之间又产生了一次数据流量。在 job 处理的数据量非常的大,或者往 hadoop 推送的数据量非常大的时候,这种情况会造成 rack 之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能以至于整个集群的服务。

开启机架感知的优势

不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架;

为了提高容错能力,DataNode 会尽可能把数据块的副本放到多个机架上。

机架感知的配置

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

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

hdfs dfsadmin -printTopology

image-20220326095700480

自定义机器机架位置

新建机架配置文件topology.data

vim $HADOOP_HOME/topology.data

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

192.168.166.121   hadoop1       /switch1/rack1
192.168.166.122   hadoop2       /switch1/rack1
192.168.166.123   hadoop3       /switch1/rack2

自定义机架感知脚本

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

vim $HADOOP_HOME/topology.sh

编写脚本内容

#!/bin/bash
# 此处是你的机架配置文件topology.sh所在目录
HADOOP_CONF=/opt/servers/hadoop
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

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

脚本必须添加可执行权限

chmod 777 topology.sh

修改 core-site.xml 文件。

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

分发配置文件和脚本

rsync-script etc/hadoop/core-site.xml

rsync-script topology.*

验证机架感知配置

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

hdfs dfsadmin -printTopology

image-20220326100557197

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

在 hadoop2.8 版本之前的版本上述的结论可能不同,主要跟 Hadoop 的副本策略有关,详细的副本策略请看 https://weixiaodyanlei.xyz/archives/hdfs-fu-ben-ji-zhi

hdfs dfs -D dfs.replication=2 -put LICENSE.txt /

可以通过如下命令查看 HDFS 中的文件所在机架

hdfs fsck /LICENSE.txt -blocks -files -locations -racks

image-20220326104255237

参考博客:https://blog.csdn.net/qq_31454379/article/details/105497503

原文地址:https://www.cnblogs.com/dawn-lewis/archive/2022/03/26/16058800.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5413.html

(0)
上一篇 2023-05-10
下一篇 2023-05-10

相关推荐

  • Python中namedtuple的使用

    Python中namedtuple的使用在Python中,有时需要自定义简单但是有名字的记录类型,如果使用字典或普通元组,通常会显得有点笨重。此时,strongnamedtuple/strong就成为了一个很好的选择。namedtuple是Python标准库collections中的一个函数,用于创建和实例化类似于元组的对象,但这些对象有名称,可以像字典一样通过名称来访问字段。namedtuple相当于一个轻量级的类定义器,它本质上是一个Python类,可以像其他类一样继承、实例化、序列化和扩展。

    2024-09-05
    21
  • spring事务与数据库事务[亲测有效]

    spring事务与数据库事务[亲测有效]一、事务与数据库的隔离级别 1、事务的ACID属性 A(Atomicity):原子性,事务要么都成功,要么都失败,是一个整体 C(Consistency):一致性,事务前后数据保持一致,如张三去银行…

    2023-02-25
    144
  • 如何在 Python 中精确保留小数点后的数值?

    如何在 Python 中精确保留小数点后的数值?在 Python 中,浮点数的精度有限,会导致小数点后的数字被舍去或四舍五入。

    2024-07-13
    66
  • 腾讯云TDSQL MySQL版 – 平台侧安全设计[通俗易懂]

    腾讯云TDSQL MySQL版 – 平台侧安全设计[通俗易懂]安全隔离 不同地域之间网络完全隔离,不同地域之间的云产品默认不能通过内网通信。此外,采用安全组和私有网络 VPC 措施进行网络隔离。 安全组:是一种有状态的包过滤功能虚拟防火墙,用于设置单台或多台云服

    2023-04-21
    149
  • Python下直观易懂的解析

    Python下直观易懂的解析Python是一种高级编程语言,它的解释执行可以让开发者更加专注于业务逻辑而不是底层的代码实现。Python的解释器会将Python代码翻译成字节码,并在Python虚拟机上执行这些字节码。同时,Python是一种动态的语言,它能够根据上下文自动推断数据类型,这使得Python编写的程序更加简洁易懂。

    2024-01-01
    130
  • 我眼中的大数据(一)[通俗易懂]

    我眼中的大数据(一)[通俗易懂]前言 在正式落地谈技术之前,先花一些篇幅说说大数据技术的发展史。我们常说的大数据技术,其实起源于Google在2004年前后发表的三篇论文,分别是分布式文件系统GFS、大数据分布式计算框架MapRed

    2023-06-07
    155
  • win10一键重装系统「建议收藏」

    win10一键重装系统「建议收藏」今天小编要给大家介绍的是云骑士装机大师win10一键重装系统,一键系统重装,无需电脑技术,小白在家也可自己完成安装,三步到位,安全简单!一键系统重装,0费用,0丢包,极加速!一起来看看吧。 1第一步…

    2023-04-12
    164
  • 利用Python NumPy进行数据切片操作

    利用Python NumPy进行数据切片操作NumPy是Python中的数学库,它提供了高性能的大型多维数组和矩阵运算。NumPy对于科学计算和数据分析非常有用,可以简化复杂数据的处理过程。

    2024-04-07
    78

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注