0.HDFS-HA的工作机制

问题:因为hdfs的中心就是namenode,而我们的集群只有一台服务器安装了nn,如果这台服务器挂掉,整个集群瘫痪,这个就是典型的单点故障,搭建HA其实就是为了解决单点故障问题

解决办法:安装多台nn

此方案有如下问题需要解决?

a)多个nn内部元数据的数据一致性的问题?

引入三台journalnode,来存储nn产生的edits文件,保证多个nn的内部数据一致性问题

b)对外提供服务问题?

​ 多个nn不能同时对外服务,同一时刻仅仅有一个NameNode对外提供服务,当这台工作的nn挂掉以后,剩下的 备胎nn直接顶上给nn定义两个状态,active和standby

c)多个Standby的nn上位问题?

​ 自动故障转移

​ d)节点状态管理功能?

​ 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brainsplit现象的发

生。

工作机制原理图

自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程,如图3-20所示。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

1.故障检测

集群中的每个NameNode在ZooKeeper中维护了一个会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

2.现役NameNode选择

ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

1)健康监测

ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

2)ZooKeeper会话管理

当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

3)基于ZooKeeper的选择

如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。

1. HDFS-HA集群配置

1.1 环境准备

​ 集群搭建

(1)修改IP

(2)修改主机名及主机名和IP地址的映射

(3)关闭防火墙

(4)ssh免密登录

(5)安装JDK,配置环境变量等

1.2 规划集群

  • Zookeeper分布式本身就是高可用

  • -HDFS HA:namenode高可用

  • Yarn HA:rcemanager高可用

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
ZKFC ZKFC ZKFC
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager ResourceManager
NodeManager NodeManager NodeManager

1.3 配置Zookeeper集群

在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper

参考:Zookeeper【概述、安装、原理、使用】

2. 配置HDFS-HA集群

2.1官方地址:http://hadoop.apache.org/

2.2在opt目录下创建一个ha文件夹

sudo mkdir ha
sudo chown atguigu:atguigu /opt/ha

2.3 将/opt/module/下的 hadoop-3.1.3拷贝到/opt/ha目录下(记得删除/data 和 /logs目录)

cp -r /opt/module/hadoop-3.1.3 /opt/ha/

2.4 配置hadoop-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_212

2.5 配置core-site.xml

<configuration>
<!-- 把多个NameNode的地址组装成一个集群mycluster;mycluster:完全分布式集群名称 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property> <!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop-3.1.3/data</value>
</property>
</configuration>

2.6 配置hdfs-site.xml

<configuration>
<!-- NameNode数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/name</value>
</property>
<!-- DataNode数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/data</value>
</property>
<!-- JournalNode数据存储目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>${hadoop.tmp.dir}/jn</value>
</property>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<!-- 节点名称可以自定义 -->
<value>nn1,nn2,nn3</value>
</property>
<!-- NameNode的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop103:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop104:8020</value>
</property>
<!-- NameNode的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop103:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop104:9870</value>
</property>
<!-- 指定NameNode共享edits文件元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
</property>
<!-- 访问代理类:client用于确定哪个NameNode为Active -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh秘钥登录,需要集群之间节点任意两台ssh免密登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/atguigu/.ssh/id_rsa</value>
</property>
</configuration>

2.7 分发配置好的hadoop环境到其他节点

[atguigu@hadoop102 hadoop-3.1.3]$ sudo xsync /opt/ha/hadoop-3.1.3

3. 启动HDFS-HA集群

1.将HADOOP_HOME环境变量更改到HA目录

sudo vim /etc/profile.d/my_env.sh

将HADOOP_HOME部分改为如下

##HADOOP_HOME
export HADOOP_HOME=/opt/ha/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

将该文件分发至各个节点

sudo xsync /etc/profile.d/my_env.sh

各个节点=source一下

source /etc/profile.d/my_env.sh

2.在各个JournalNode节点上,输入以下命令启动journalnode服务

hdfs --daemon start journalnode

查看下JournalNode进程

3.在【nn1】上,对其进行格式化,并启动

hdfs namenode -format
hdfs --daemon start namenode

查看【nn1】节点上的namenode进程

查看各个节点数据

[atguigu@hadoop103 hadoop-3.1.3]$ tree /opt/ha/hadoop-3.1.3/data/

nn1】 【nn2【nn3】

4.在【nn2】和【nn3】上,分别同步【nn1】的元数据信息

[atguigu@hadoop104 hadoop-3.1.3]$ hdfs namenode -bootstrapStandby

查看各个节点数据变化,各个节点元数据信息一致

nn1】 【nn2【nn3】

5.启动【nn2】和【nn3】的namenode

[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode

6.查看web页面显示

hadoop102(standby)

hadoop103(standby)

hadoop104(standby)

7.在所有节点上,启动datanode

[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start datanode

8.手动将【nn1】切换为Active查看是否Active

[atguigu@hadoop102 hadoop-3.1.3]$ hdfs haadmin -transitionToActive nn1
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs haadmin -getServiceState nn1

查看【nn1】web界面

目前还不能实现故障自动转移

4.配置HDFS-HA自动故障转移

1.具体配置

(1)在hdfs-site.xml中增加

<!-- 启用nn故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

(2)在core-site.xml文件中增加

<!-- 指定zkfc要连接的zkServer地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>

(3)将hdfs-site.xml和core-site.xml分发到其他节点

[atguigu@hadoop102 hadoop-3.1.3]$ xsync etc/hadoop/

2.启动

(1)关闭所有HDFS服务:

[atguigu@hadoop102 hadoop-3.1.3]$ stop-dfs.sh

(2)启动Zookeeper集群,各个节点启动zkServer,可以用群起脚本

zkServer.sh start

(3)在【nn1】初始化HA在Zookeeper中状态:

[atguigu@hadoop102 hadoop-3.1.3]$ hdfs zkfc -formatZK

另外开个shell窗口,启动zookeeper客户端

[atguigu@hadoop102 ~]$ zkCli.sh

zookeeper多了一个hadoop-ha/mycluster节点

(4)启动HDFS服务:

[atguigu@hadoop102 hadoop-3.1.3]$ start-dfs.sh

如果各个节点进程如上图所示,则证明HDFS的HA自动故障转移搭建成功

)

3.验证

(1)查看web页面

hadoop102(standby)

hadoop103(active)

hadoop104(standby)

(2)在Active的节点将NameNode进程kill

[atguigu@hadoop103 hadoop-3.1.3]$ kill -9 8988

(3)查看web页面

此时hadoop102从standby状态变为active,hadoop104状态依然是standby

5. YARN-HA配置

5.1YARN-HA工作机制

1)官方文档:

http://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

2)YARN-HA工作机制

4.4.2 配置YARN-HA集群

1)环境准备

(1)修改IP

(2)修改主机名及主机名和IP地址的映射

(3)关闭防火墙

(4)ssh免密登录

(5)安装JDK,配置环境变量等

(6)配置Zookeeper集群

2)规划集群

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager
NodeManager NodeManager NodeManager

3)具体配置

(1)yarn-site.xml

<configuration>

    <property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property> <!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property> <!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!--指定resourcemanager的逻辑列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- ========== rm1的配置 ========== -->
<!--指定rm1的主机名-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop102</value>
</property>
<!-- 指定rm1的web端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop102:8088</value>
</property>
<!-- 指定rm1的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop102:8032</value>
</property>
<!-- 指定AM向rm1申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop102:8030</value>
</property>
<!-- 指定供NM连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop102:8031</value>
</property>
<!-- ========== rm2的配置 ========== -->
<!--指定rm2的主机名-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop103:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop103:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop103:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop103:8031</value>
</property> <!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property> <!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property> <!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property> </configuration>

(2)同步更新其他节点的配置信息

xsync /opt/ha/hadoop-3.1.3/yarn-site.xml

4)启动hdfs

start-dfs.sh

5)启动YARN

(1)在hadoop102或者hadoop103中执行:

start-yarn.sh

(2)查看服务状态

yarn rmadmin -getServiceState rm1

(3)web端查看hadoop102:8088和hadoop103:8088的YARN的状态

注意:

yarn的web页面访问无论访问那个节点会重定向到active这个节点,不是错误

hdfs的web页面avtive,standby都可以访问;

Hadoop【Hadoop-HA搭建(HDFS、YARN)】的更多相关文章

  1. Hadoop(HDFS,YARN)的HA集群安装

    搭建Hadoop的HDFS HA及YARN HA集群,基于2.7.1版本安装. 安装规划 角色规划 IP/机器名 安装软件 运行进程 namenode1 zdh-240 hadoop NameNode ...

  2. Apache hadoop namenode ha和yarn ha ---HDFS高可用性

    HDFS高可用性Hadoop HDFS 的两大问题:NameNode单点:虽然有StandbyNameNode,但是冷备方案,达不到高可用--阶段性的合并edits和fsimage,以缩短集群启动的时 ...

  3. 攻城狮在路上(陆)-- hadoop分布式环境搭建(HA模式)

    一.环境说明: 操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 ...

  4. Hadoop 2、配置HDFS HA (高可用)

    前提条件 先搭建 http://www.cnblogs.com/raphael5200/p/5152004.html 的环境,然后在其基础上进行修改 一.安装Zookeeper 由于环境有限,所以在仅 ...

  5. hadoop完全分布式搭建HA(高可用)

    2018年03月25日 16:25:26 D调的Stanley 阅读数:2725 标签: hadoop HAssh免密登录hdfs HA配置hadoop完全分布式搭建zookeeper 配置 更多 个 ...

  6. Hadoop生产环境搭建(含HA、Federation)

    Hadoop生产环境搭建 1. 将安装包hadoop-2.x.x.tar.gz存放到某一目录下,并解压. 2. 修改解压后的目录中的文件夹etc/hadoop下的配置文件(若文件不存在,自己创建.) ...

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

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

  8. hadoop namenode HA集群搭建

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

  9. hadoop学习第二天-了解HDFS的基本概念&&分布式集群的搭建&&HDFS基本命令的使用

    一.HDFS的相关基本概念 1.数据块 1.在HDFS中,文件诶切分成固定大小的数据块,默认大小为64MB(hadoop2.x以后是128M),也可以自己配置. 2.为何数据块如此大,因为数据传输时间 ...

随机推荐

  1. DeWeb发展历程! 从2015年开始

    有位朋友问: [高中]长兴(667499XX) 2021-01-15 15:52:11 deweb会长期做吗 我查了一下,发现deweb最早从2015开始,算起来已经做了5~6年了,目前已日臻成熟!

  2. Ambari 2.4 在 CentOS 7.4 因 TLS_1.2 协商内部错误导致注册失败

    问题背景 业务准备在天翼云上搭建一套线上环境,VM 操作系统版本为 CentOS Linux release 7.4.1708,但是在 ambari Web 管理页面上部署hadoop节点主机的时候, ...

  3. 用 Node.js 实现的最简单的 HTTP 服务器

    用 Node.js 实现的最简单的 HTTP 服务器 //app.js var http = require('http'); http.createServer(function(req, res) ...

  4. Java线程状态及同步锁

    线程的生命历程 线程的五大状态 创建状态:简而言之,当创建线程对象的代码出现的时候,此时线程就进入了创建状态.这时候的线程只是行代码而已.只有调用线程的start()方法时,线程的状态才会改变,进入就 ...

  5. Markdown For EditPlus插件使用说明(基于EditPlus快速编辑Markdonw文件,写作爱好者的福音来啦)

    Markdown For EditPlus插件使用说明 开发缘由 特点好处: 中文版使用说明 相关命令(输入字符敲空格自动输出): EditPlus常用快捷键: 相关教程: English descr ...

  6. 【JavaScript定时器小案例】常见的几种定时器实现的案例

    [JavaScript定时器小案例]常见的几种定时器实现的案例 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 在日常开发 ...

  7. UML常用建模工具简介,安装方法和各自的优点

    这学期学习了统一建模语言,自己初学时对各种建模工具十分陌生,各种名词都不懂,软件也都不了解,开始很是不知所措.为了防止其他初学者陷入我的困境,自己对各种工具进行了总结: Visio:介绍:Visio是 ...

  8. [cf720D]Slalom

    对于每一行,这些障碍将其划分为若干段,记第$i$行($y=i$时)从左到右第$j$段为$[l_{i,j},r_{i,j}]$ 显然一条路径恰好经过每一行中的一段,且两种方案不同当且仅当其中经过的一段不 ...

  9. [loj6498]农民

    对每一个节点用二元组$(p,v)$表示,其中$p$是其是父亲的左(0)还是右(1)儿子,$v$是其父亲的点权 $x$合法当且仅当:对于其到根路径上所有$(0,v)$都有$a_{x}<v$.$(1 ...

  10. [luogu4331]数字序列

    令$a'_{i}=a_{i}+n-i$.$b'_{i}=b_{i}+n-i$,代价仍然是$\sum_{i=1}^{n}|a'_{i}-b'_{i}|$,但条件变为了$b'_{i}\le b'_{i+1 ...