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。机器感知如下图所示:

图中的 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
说明:
- 当没有配置机架信息时,所有的机器 Hadoop 都在同一个默认的机架下,名为 "/defult-rack",这种情况的任何一台 DataNode 机器,bug物理上是否属于同一个机架,都会被认为是在同一个机架下。
- 一旦配置 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

自定义机器机架位置
新建机架配置文件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

测试上传文件,因为只搭建了三个节点,因此设置副本数为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

参考博客:https://blog.csdn.net/qq_31454379/article/details/105497503
HDFS机架感知的更多相关文章
- hdfs 机架感知和复制因子的设置
dfs.replication 新更新的复制因子的参数对原来的文件不起作用. 譬如说,原来的复制因子是2,则原来文件上传的时候就只有两个副本. 现在把dfs.replication设置为3,重新启动h ...
- HDFS机架感知功能原理(rack awareness)
转自:http://www.jianshu.com/p/372d25352d3a HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和Blo ...
- hadoop(三):hdfs 机架感知
client 向 Active NN 发送写请求时,NN为这些数据分配DN地址,HDFS文件块副本的放置对于系统整体的可靠性和性能有关键性影响.一个简单但非优化的副本放置策略是,把副本分别放在不同机架 ...
- [HDFS_add_3] HDFS 机架感知
0. 说明 HDFS 副本存放策略 && 配置机架感知 1. HDFS 的副本存放策略 HDFS 的副本存放策略是将一个副本存放在本地机架节点上,另外两个副本放在不同机架的不同节点上 ...
- hdfs 机架感知
一.背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高 ...
- HDFS副本机制&负载均衡&机架感知&访问方式&健壮性&删除恢复机制&HDFS缺点
副本机制 1.副本摆放策略 第一副本:放置在上传文件的DataNode上:如果是集群外提交,则随机挑选一台磁盘不太慢.CPU不太忙的节点上:第二副本:放置在于第一个副本不同的机架的节点上:第三副本:与 ...
- HDFS副本放置策略和机架感知
副本放置策略 的副本放置策略的基本思想是: 第一block在复制和client哪里node于(假设client它不是群集的范围内,则这第一个node是随机选取的.当然系统会尝试不选择哪些太满或者太忙的 ...
- Hadoop(8)-HDFS的读写数据流程以及机架感知
1. HDFS的写数据流程 1.客户端通过fs模块向NameNode申请文件上传,NameNode检查请求是否合法,如用户权限,目标文件是否已存在,父目录是否存在等等 2.NameNode返回是否可以 ...
- HDFS 02 - HDFS 的机制:副本机制、机架感知机制、负载均衡机制
目录 1 - HDFS 的副本机制 2 - HDFS 的机架感知机制 3 - HDFS 的负载均衡机制 参考资料 版权声明 1 - HDFS 的副本机制 HDFS 中的文件,在物理上都是以分块(blo ...
随机推荐
- Solution -「多校联训」博弈
\(\mathcal{Description}\) Link. A B 两人在树上博弈,初始时有一枚棋子在结点 \(1\).由 A 先操作,两人轮流移动沿树上路径棋子,且满足本次移动的树上距离 ...
- python中的第一行#!
一般python脚本的开通会写成 #! /usr/bin/python 这表示用/usr/bin目录下的这个python可执行文件来进行运行脚本 当然如果你还安装了其他版本的python,可以将第一行 ...
- 手写一个springboot starter
springboot的starter的作用就是自动装配.将配置类自动装配好放入ioc容器里.作为一个组件,提供给springboot的程序使用. 今天手写一个starter.功能很简单,调用start ...
- 神奇!这款 Vue 后台框架居然不用手动配置路由
前言 做 Vue 开发脱离不了路由,尤其是中大型项目,页面多且杂,在配置路由的时候总是会变得逐渐暴躁,因为费时,并且又没有什么太多技术含量,总觉得是在浪费时间. 另外如果接手了别人的项目,当业务有变更 ...
- 【基础篇】js对本地文件增删改查--增
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- CSRF POST型
实验目的 掌握POST型CSRF基础知识 实验原理 管理员点击恶意链接,密码被修改 实验内容 POST型CSRF漏洞 实验环境描述 带有CSRF漏洞的注册登录系统 实验步骤 登录密码 用户名为 roo ...
- 3款自助型BI分析平台功能盘点,帮助你预测商业发展方向
在快速发展的今天,商业智能BI已经不同于传统的商业智能BI,商业智能BI已经逐渐转变为自助和业务主导的模式,自助BI分析平台应运而生,自助BI分析平台逐渐成为许多企业的选择. 自助式BI分析平台与传统 ...
- Zabbix 5.0:服务端进程总结
Blog:博客园 个人 参考:<深入理解Zabbix监控系统>.<Zabbix用户手册> Zabbix服务端进程被分为不同的种类,每一种进程负责相应的任务,包括收集原始监控数据 ...
- readonly 只读字段的初始化值确定|static 字段的初始值确定
类的初始化顺序 如下: 第一次实例化Son============================ C#编译器缺省将每一个成员变量初始化为他的默认值Son静态字段Son静态构造函数Son字段Fathe ...
- linux 解决磁盘占用100%
df -h 查看磁盘使用情况 ll -h 查看文件的大小 使用如下命令查找大于100M的大文件,发现有几个日志文件及临时文件比较大,使用rm –rf删除即可. find / -size +10 ...