一、背景

  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 集群拓扑:

二、配置机架感知

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

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

<property>
  <name>topology.script.file.name</name>
  <value>/home/hadoop/apps/hadoop-2.7./etc/hadoop/topology.sh</value>
</property>

  这个配置项的 value 通常是一个执行文件,该执行文件是一个 shell 脚本 topology.sh,

  该脚本 接收一个参数,输出一个值。

  接收的参数:datanode 节点的 IP 地址,比如:192.168.123.102

  输出值:datanode 节点所在的机架配置信息,比如:/switch1/rack1

  Namenode 启动时,会判断该配置选项是否为空,如果非空,则表示已经启用机架感知的配 置,此时 namenode 会根据配置寻找该脚本,并在接收到每一个 datanode 的 heartbeat 时,将该 datanode 的 ip 地址作为参数传给该脚本运行,并将得到的输出作为该 datanode 所属的 机架 ID,保存到内存的一个 map 中. 至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器 的 ip 地址和机器名正确的映射到相应的机架上去。一个简单的实现如下:

topology.sh

#!/bin/bash
HADOOP_CONF=/home/hadoop/apps/hadoop-2.7./etc/hadoop
while [ $# -gt ] ;
do
nodeArg=$
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 hadoop1 /switch1/rack1
192.168.123.103 hadoop2 /switch1/rack1
192.168.123.104 hadoop3 /switch2/rack2
192.168.123.105 hadoop4 /switch2/rack2

  在自己对应的hadoop配置目录添加这两个文件,其中 switch 表示交换机,rack 表示机架 需要注意的是,在 Namenode 上,该文件中的节点必须使用 IP,使用主机名无效,而 ResourceManager 上,该文件中的节点必须使用主机名,使用 IP 无效,所以,最好 IP 和主 机名都配上。

   注意:以上两个文件都需要添加可执行权限

[hadoop@hadoop1 hadoop]$ chmod 777 topology.data topology.sh

2.2、验证机架感知

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

[hadoop@hadoop1 hadoop]$ hadoop dfsadmin -printTopology
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it. Rack: /switch1/rack1
192.168.123.102: (hadoop1)
192.168.123.103: (hadoop2) Rack: /switch2/rack2
192.168.123.104: (hadoop3)
192.168.123.105: (hadoop4) [hadoop@hadoop1 hadoop]$

三、补充

3.1、增加 datanode 节点

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

3.2、节点间距离计算

  有了机架感知,NameNode就可以画出下图所示的datanode网络拓扑图。

  D1,R1都是交换机, 最底层Hx是 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)= 相同的 datanode
distance(/D1/R1/H1,/D1/R1/H2)= 同一 rack 下的不同 datanode
distance(/D1/R1/H1,/D1/R2/H4)= 同一 IDC 下的不同 datanode
distance(/D1/R1/H1,/D2/R3/H7)= 不同 IDC 下的 datanode

  写文件时根据策略输入 dn 节点列表,读文件时按与client由近到远距离返回 dn 列表

ZooKeeper学习之路 (十)Hadoop的HA集群的机架感知的更多相关文章

  1. Hadoop的HA集群启动和停止流程

    假设我们有3台虚拟机,主机名分别是hadoop01.hadoop02和hadoop03. 这3台虚拟机的Hadoop的HA集群部署计划如下: 3台虚拟机的Hadoop的HA集群部署计划 hadoop0 ...

  2. ZooKeeper学习之路 (九)利用ZooKeeper搭建Hadoop的HA集群

    Hadoop HA 原理概述 为什么会有 hadoop HA 机制呢? HA:High Available,高可用 在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SP ...

  3. hadoop namenode HA集群搭建

    hadoop集群搭建(namenode是单点的)  http://www.cnblogs.com/kisf/p/7456290.html HA集群需要zk, zk搭建:http://www.cnblo ...

  4. hadoop搭建HA集群之后不能自动切换namenode

    在搭好HA集群之后,想测试一下集群的高可用性,于是先把active的namenode给停掉: hadoop-daemon.sh stop namenode 或者直接kill掉该节点namenode的对 ...

  5. hadoop学习通过虚拟机安装hadoop完全分布式集群

    要想深入的学习hadoop数据分析技术,首要的任务是必须要将hadoop集群环境搭建起来,可以将hadoop简化地想象成一个小软件,通过在各个物理节点上安装这个小软件,然后将其运行起来,就是一个had ...

  6. hadoop yarn HA集群搭建

    可先完成hadoop namenode HA的搭建:http://www.cnblogs.com/kisf/p/7458519.html 搭建yarnde HA只需要在namenode HA配置基础上 ...

  7. HBase学习之路 (二)HBase集群安装

    前提 1.HBase 依赖于 HDFS 做底层的数据存储 2.HBase 依赖于 MapReduce 做数据计算 3.HBase 依赖于 ZooKeeper 做服务协调 4.HBase源码是java编 ...

  8. HBase 学习之路(四)—— HBase集群环境配置

    一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...

  9. 搭建hadoop的HA集群模式(hadoop2.7.3+hive+spark)

    参考:http://blog.51cto.com/12824426/2177663?source=drh 一.集群的规划 Zookeeper集群:192.168.176.131 (bigdata112 ...

随机推荐

  1. IDEA 2019注册码

    N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...

  2. 【转】类找不到总结java.lang.ClassNotFoundException

    (1)org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.microsoft.sqls ...

  3. SpringBoot(二) Core Features: SpringApplication

    参考 文档: SpringApplication

  4. Servlet自动注入Spring容器中的Bean解决方法

    很多情况在进行Web开发的时候需要自己手写Servlet来完成某些功能,而servlet有需要注入Spring容器中的某些bean,这是每次都要手动获取比较麻烦,这里有一个解决方案,只需要写一个ser ...

  5. javascript代码

    LazyMan 实现LazyMan(什么是LazyMan?请自行google) function _LazyMan(_name) { var _this = this; _this.tasks = [ ...

  6. 用Struts2实现列表显示和分页功能

    引用自http://www.2cto.com/kf/201309/243730.html BlogDAO.java文件 /** 根据条件(默认一张表所有数据)返回多条记录 */ public List ...

  7. apply与call简单用法以及判断数组的坑

    1 typeof 和 instanceof var array = [];平时如果判断一个对象是否为数组,可能你会用 typeof array,但是输出为“object”. typeof 一般只能返回 ...

  8. VSCode环境

    PythonPython for VSCode Language Support for Java(TM) by Red HatJava Language SupportJava DebuggerJa ...

  9. java应用破解之破解 jeb mips 2.3.3

    前言 jeb 的新版支持 mips的反编译 ,于是去官网申请一个试用版,试用版的限制还是比较多的,比如 使用时间验证,没法复制粘贴 等,于是想尝试看看能否破解,同时填了 java破解 这个坑. 修改版 ...

  10. java基础(三) 加强型for循环与Iterator

    引言   从JDK1.5起,增加了加强型的for循环语法,也被称为 "for-Each 循环".加强型循环在操作数组与集合方面增加了很大的方便性.那么,加强型for循环是怎么解析的 ...