首页 > 其他分享 >HDFS--机架感知

HDFS--机架感知

时间:2023-03-15 22:05:49浏览次数:36  
标签:HDFS 副本 R1 -- datanode 机架 节点


一、背景介绍


Hadoop的设计目的:解决海量大文件的处理问题,主要指大数据的存储和计算问题,其中,HDFS解决数据的存储问题;MapReduce解决数据的计算问题

 

Hadoop的设计考虑:设计分布式的存储和计算解决方案架构在廉价的集群之上,所以,服务器节点出现宕机的情况是常态。数据的安全是重要考虑点。HDFS的核心设计思路就是对用户存进HDFS里的所有数据都做冗余备份,以此保证数据的安全

 

那么Hadoop在设计时考虑到数据的安全,数据文件默认在HDFS上存放三份。显然,这三份副本肯定不能存储在同一个服务器节点。那怎么样的存储策略能保证数据既安全也能保证数据的存取高效呢?

 

HDFS分布式文件系统的内部有一个副本存放策略:以默认的副本数=3为例:

1、第一个副本块存本机

2、第二个副本块存跟本机同机架内的其他服务器节点

3、第三个副本块存不同机架的一个服务器节点上

 

好处:

1、如果本机数据损坏或者丢失,那么客户端可以从同机架的相邻节点获取数据,速度肯定要比跨机架获取数据要快。

2、如果本机所在的机架出现问题,那么之前在存储的时候没有把所有副本都放在一个机架内,这就能保证数据的安全性,此种情况出现,就能保证客户端也能取到数据

 

HDFS为了降低整体的网络带宽消耗和数据读取延时,HDFS集群一定会让客户端尽量去读取近的副本,那么按照以上头解释的副本存放策略的结果:

1、如果在本机有数据,那么直接读取

2、如果在跟本机同机架的服务器节点中有该数据块,则直接读取

3、如果该HDFS集群跨多个数据中心,那么客户端也一定会优先读取本数据中心的数据

 

但是HDFS是如何确定两个节点是否是统一节点,如何确定的不同服务器跟客户端的远近呢?答案就是机架感知。!!!!

 

在默认情况下,HDFS集群是没有机架感知的,也就是说所有服务器节点在同一个默认机架中。那也就意味着客户端在上传数据的时候,HDFS集群是随机挑选服务器节点来存储数据块的三个副本的。

 

那么假如,datanode1和datanode3在同一个机架rack1,而datanode2在第二个机架rack2,那么客户端上传一个数据块block_001,HDFS将第一个副本存放在dfatanode1,第二个副本存放在datanode2,那么数据的传输已经跨机架一次(从rack1到rack2),然后HDFS把第三个副本存datanode3,此时数据的传输再跨机架一次(从rack2到rack1)。显然,当HDFS需要处理的数据量比较大的时候,那么没有配置机架感知就会造成整个集群的网络带宽的消耗非常严重。

 

下图是没有配置机架感知的HDFS集群拓扑:

HDFS--机架感知_大数据


二、配置机架感知


1、修改配置文件core-site.xml



给NameNode节点的core-site.xml配置文件增加一项配置:


#!/bin/bash  
HADOOP_CONF=/home/hadoop/apps/hadoop-2.6.5/etc/hadoop
while [ $# -gt 0 ] ;
do
nodeArg=$1
exec<${HADOOP_CONF}/topology.data
result=""
while read line
do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]
then
result="${ar[2]}"
fi
done
shift
if [ -z "$result" ]
then
echo -n "/default-rack"
else
echo -n "$result"
fi
done


那么通过阅读脚本内容知道,我们需要准备一个topology.data的文件。topology.data的内容如下:


192.168.123.102  hadoop02        /switch1/rack1
192.168.123.103 hadoop03 /switch1/rack1
192.168.123.104 hadoop04 /switch2/rack2
192.168.123.105 hadoop05 /switch2/rack2


其中switch表示交换机,rack表示机架

 


需要注意的是,在Namenode上,该文件中的节点必须使用IP,使用主机名无效,而ResourceManager上,该文件中的节点必须使用主机名,使用IP无效,所以,最好IP和主机名都配上。



2、验证



以上配置做好之后,启动集群,启动完集群之后,在使用命令:

hdfs  dfsadmin  -printTopology 

查看整个集群的拓扑图:


HDFS--机架感知_hdfs_02




三、补充


1、增加datanode节点


增加datanode节点,不需要重启namenode
非常简单的做法:在topology.data文件中加入新加datanode的信息,然后启动起来就OK


2、节点间距离计算


有了机架感知,NameNode就可以画出下图所示的datanode网络拓扑图。D1,R1都是交换机,最底层是datanode。则H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。这些rackid信息可以通过topology.script.file.name配置。有了这些rackid信息就可以计算出任意两台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






标签:HDFS,副本,R1,--,datanode,机架,节点
From: https://blog.51cto.com/u_6468453/6123561

相关文章

  • Java虚拟机详解——JVM常见问题总结
    面试必问关键词:JVM垃圾回收、类加载机制。 先把本文的目录画一个思维导图:一、Java引用的四种状态:强引用:用的最广。我们平时写代码时,new一个Object存放在堆内存......
  • Linux查看、修改SELinux的状态
    SELinux(Security-Enhanced ​​Linux​​)是美国国家安全局(NSA)对于强制访问控制的实现,是 ​​linux​​历史上最杰出的新安全子系统。但是我们一般都不用它,因为它管的......
  • 基于python实现的抓取腾讯视频所有电影的爬虫
    我搜集了国内10几个电影网站的数据,里面近几十W条记录,用文本没法存,mongodb学习成本非常低,安装、下载、运行起来不会花你5分钟时间。#-*-coding:utf-8-*-importreimport......
  • hadoop 2.x常用端口及查看方法
    hadoop2.x常用端口及查看方法一、常用端口组件节点默认端口配置用途说明HDFSDataNode50010dfs.datanode.addressdatanode服务端口,用于数据传输HDFSDataNode50075dfs.data......
  • shell 快捷键 超提高命令行,输入效率
    根据功能进行归类。光标移动命令说明Alt+b后移一个单词Alt+f前移一个单词Ctrl+b后移一个字符Ctrl+f前移一个字符Ctrl+a把光标移到行首Ctrl+e把......
  • 企业级大数据技术框架
    大数据尝试从海量数据中,通过一定的分布式技术手段,挖掘出有价值的信息,最终提供给用户,进而产生实用价值和商业价值。从数据在信息系统中的生命周期看,大数据从数据源开始,经过分......
  • python应用题 字符填充
    提示代码#请在_______完善代码s=input()print("{_______(1)_________}".format(_______(2)_________))......
  • c代码实现九九乘法表的打印
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){inti=0;for(i=1;i<=9;i++){intj=0;for(j=1;j<=i;j++){printf(......
  • 数据建模——NULL#yyds干货盘点#
    Hive含义在Hive中,NULL代表缺失或未知的值。如果表中某个字段为NULL,则意味着该字段没有被填充或未知。可以使用ISNULL(field)或ISNOTNULL(field)来检查一个字段的值是......
  • ViewFlipper的基本使用
    ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放!和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候,用来实现进入应用......