22 - Hadoop HA 高可用集群搭建、手动模式、自动模式以及HA模式集群

目录

[1、HA 概述](#1、HA 概述)

[2、HDFS-HA 集群搭建](#2、HDFS-HA 集群搭建)

[2.1、HDFS-HA 核心问题](#2.1、HDFS-HA 核心问题)

[3、HDFS-HA 手动模式](#3、HDFS-HA 手动模式)

3.1、环境准备

3.2、规划集群

[3.3、配置 HDFS-HA 集群](#3.3、配置 HDFS-HA 集群)

[3.4、启动 HDFS-HA 集群](#3.4、启动 HDFS-HA 集群)

[4、HDFS-HA 自动模式](#4、HDFS-HA 自动模式)

[4.1、HDFS-HA 自动故障转移工作机制](#4.1、HDFS-HA 自动故障转移工作机制)

[4.2、HDFS-HA 自动故障转移的集群规划](#4.2、HDFS-HA 自动故障转移的集群规划)

[4.3、配置 HDFS-HA 自动故障转移](#4.3、配置 HDFS-HA 自动故障转移)

[5、YARN-HA 配置](#5、YARN-HA 配置)

[5.1、YARN-HA 工作机制](#5.1、YARN-HA 工作机制)

[5.2、配置 YARN-HA 集群](#5.2、配置 YARN-HA 集群)

[6、HADOOP HA 的最终规划](#6、HADOOP HA 的最终规划)


1、HA 概述

(1)所谓 HA(High Availablity),即高可用(7*24 小时不中断服务)。

(2)实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA 机制:HDFS 的 HA 和 YARN 的 HA。

(3)NameNode 主要在以下两个方面影响 HDFS 集群

  • NameNode 机器发生意外,如宕机,集群将无法使用,直到管理员重启
  • NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用

HDFS HA 功能通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的 热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方 式将 NameNode 很快的切换到另外一台机器。


2、HDFS-HA 集群搭建

2.1、HDFS-HA 核心问题

1)怎么保证三台 namenode 的数据一致

  • a.Fsimage:让一台 nn 生成数据,让其他机器 nn 同步
  • b.Edits:需要引进新的模块 JournalNode 来保证 edtis 的文件的数据一致性

2)怎么让同时只有一台 nn 是 active,其他所有是 standby 的

  • a.手动分配
  • b.自动分配

3)2nn 在 ha 架构中并不存在,定期合并 fsimage 和 edtis 的活谁来干

由 standby 的 nn 来干

4)如果 nn 真的发生了问题,怎么让其他的 nn 上位干活

  • a.手动故障转移
  • b.自动故障转移

3、HDFS-HA 手动模式

3.1、环境准备

  • (1)修改 IP
  • (2)修改主机名及主机名和 IP 地址的映射
  • (3)关闭防火墙
  • (4)ssh 免密登录
  • (5)安装 JDK,配置环境变量等

3.2、规划集群

3.3、配置 HDFS-HA 集群

1)官方地址:http://hadoop.apache.org/

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

bash 复制代码
[kgf@hadoop102 opt]$ ll
总用量 0
drwxr-xr-x. 5 kgf kgf  69 4月  27 10:59 module
drwxr-xr-x. 2 kgf kgf 108 4月  27 10:56 software
[kgf@hadoop102 opt]$  sudo mkdir ha
[kgf@hadoop102 opt]$  sudo chown kgf:kgf /opt/ha
[kgf@hadoop102 opt]$ pwd
/opt
[kgf@hadoop102 opt]$ ll
总用量 0
drwxr-xr-x. 2 kgf kgf   6 4月  29 20:36 ha
drwxr-xr-x. 5 kgf kgf  69 4月  27 10:59 module
drwxr-xr-x. 2 kgf kgf 108 4月  27 10:56 software
[kgf@hadoop102 opt]$

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

kgf@hadoop102 opt$ cp -r /opt/module/hadoop-3.1.3 /opt/ha/

4)配置 core-site.xml

XML 复制代码
<configuration>
    <!-- 把多个 NameNode 的地址组装成一个集群 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>

5)配置 hdfs-site.xml

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 元数据在 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 秘钥登录-->
	 <property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/home/kgf/.ssh/id_rsa</value>
	 </property>
</configuration>

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

3.4、启动 HDFS-HA 集群

1)将 HADOOP_HOME 环境变量更改到 HA 目录(三台机器)

kgf@hadoop104 opt$ 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

去三台机器上 source 环境变量

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

kgf@hadoop102 \~$ hdfs --daemon start journalnode

kgf@hadoop103 \~$ hdfs --daemon start journalnode

kgf@hadoop104 \~$ hdfs --daemon start journalnode

3)在nn1上,对其进行格式化,并启动

kgf@hadoop102 \~$ hdfs namenode -format

kgf@hadoop102 \~$ hdfs --daemon start namenode

4)在nn2nn3上,同步 nn1 的元数据信息

kgf@hadoop103 \~$ hdfs namenode -bootstrapStandby

kgf@hadoop104 \~$ hdfs namenode -bootstrapStandby

5)启动nn2nn3

kgf@hadoop103 \~$ hdfs --daemon start namenode

kgf@hadoop104 \~$ hdfs --daemon start namenode

6)查看 web 页面显示

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

kgf@hadoop102 \~$ hdfs --daemon start datanode

kgf@hadoop103 \~$ hdfs --daemon start datanode

kgf@hadoop104 \~$ hdfs --daemon start datanode

8)将nn1切换为 Active

kgf@hadoop102 hadoop-3.1.3$ hdfs haadmin -transitionToActive nn1

9)查看是否 Active

kgf@hadoop102 hadoop-3.1.3$ hdfs haadmin -getServiceState nn1

active

kgf@hadoop102 hadoop-3.1.3$

4、HDFS-HA 自动模式

4.1、HDFS-HA 自动故障转移工作机制

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

4.2、HDFS-HA 自动故障转移的集群规划

4.3、配置 HDFS-HA 自动故障转移

1)具体配置

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

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

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

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

(3)修改后分发配置文件

kgf@hadoop102 hadoop-3.1.3$ pwd

/opt/ha/hadoop-3.1.3

kgf@hadoop102 hadoop-3.1.3$ xsync etc/hadoop/

2)启动

(1)关闭所有 HDFS 服务:

kgf@hadoop102 \~$ stop-dfs.sh

(2)启动 Zookeeper 集群:

kgf@hadoop102 \~$ zkServer.sh start

kgf@hadoop103 \~$ zkServer.sh start

kgf@hadoop104 \~$ zkServer.sh start

(3)启动 Zookeeper 以后,然后再初始化 HA 在 Zookeeper 中状态:

kgf@hadoop102 bin$ hdfs zkfc -formatZK

(4)启动 HDFS 服务:

kgf@hadoop102 bin$ start-dfs.sh

(5)可以去 zkCli.sh 客户端查看 Namenode 选举锁节点内容:

zk: localhost:2181(CONNECTED) 1 get -s /hadoop-ha/mycluster/ActiveStandbyElectorLock

myclusternn1 hadoop102 �>(�>

cZxid = 0x300000008

ctime = Mon Apr 29 21:27:24 CST 2024

mZxid = 0x300000008

mtime = Mon Apr 29 21:27:24 CST 2024

pZxid = 0x300000008

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x300003ae48b0001

dataLength = 33

numChildren = 0

zk: localhost:2181(CONNECTED) 2

3)验证

(1)将 Active NameNode 进程 kill,查看网页端三台 Namenode 的状态变化

atguigu@hadoop102 \~$ kill -9 namenode 的进程 id

5、YARN-HA 配置

5.1、YARN-HA 工作机制

5.2、配置 YARN-HA 集群

4)具体配置

(1)yarn-site.xml

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,rm3</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>
	
	<!-- ========== rm3 的配置 ========== -->
	<!-- 指定 rm1 的主机名 -->
	 <property>
		<name>yarn.resourcemanager.hostname.rm3</name>
		<value>hadoop104</value>
	</property>
	
	<!-- 指定 rm1 的 web 端地址 -->
	<property>
		<name>yarn.resourcemanager.webapp.address.rm3</name>
		<value>hadoop104:8088</value>
	</property>
	
	<!-- 指定 rm1 的内部通信地址 -->
	<property>
		<name>yarn.resourcemanager.address.rm3</name>
		<value>hadoop104:8032</value>
	</property>
	
	<!-- 指定 AM 向 rm1 申请资源的地址 -->
	<property>
		<name>yarn.resourcemanager.scheduler.address.rm3</name> 
		<value>hadoop104:8030</value>
	</property>
	
	<!-- 指定供 NM 连接的地址 --> 
	<property>
		<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
		<value>hadoop104: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)同步更新其他节点的配置信息,分发配置文件

kgf@hadoop102 hadoop-3.1.3$ ls

bin data etc hello.txt include lib libexec LICENSE.txt liubei.txt logs NOTICE.txt README.txt sbin share wc.jar

kgf@hadoop102 hadoop-3.1.3$ xsync etc/hadoop/

4)启动 YARN

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

kgf@hadoop102 hadoop-3.1.3$ jps

5873 NameNode

6178 Jps

5059 DataNode

4652 QuorumPeerMain

5532 DFSZKFailoverController

5295 JournalNode

kgf@hadoop102 hadoop-3.1.3$ start-yarn.sh

Starting resourcemanagers on hadoop102 hadoop103 hadoop104

Starting nodemanagers

kgf@hadoop102 hadoop-3.1.3$

(2)查看服务状态

kgf@hadoop102 hadoop-3.1.3$ yarn rmadmin -getServiceState rm1

active

kgf@hadoop102 hadoop-3.1.3$

(3)可以去 zkCli.sh 客户端查看 ResourceManager 选举锁节点内容:

kgf@hadoop102 \~$ zkCli.sh

zk: localhost:2181(CONNECTED) 16 get -s

/yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock

cluster-yarn1rm1

cZxid = 0x100000022

ctime = Tue Jul 14 17:06:44 CST 2020

mZxid = 0x100000022

mtime = Tue Jul 14 17:06:44 CST 2020

pZxid = 0x100000022

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x30000da33080005

dataLength = 20

numChildren = 0

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

6、HADOOP HA 的最终规划

相关推荐
Zhu7581 天前
在k8s集群环境部署高可用的Apache Hadoop3.1.1定制版集群
hadoop·kubernetes
还有你Y2 天前
软件工程架构
hadoop·架构·软件工程
曾阿伦6 天前
Windows 下运行 Hadoop 并部署到 AWS EMR 指南
hadoop·windows·aws
极光代码工作室7 天前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
liuxiaowei38 天前
Winform+WPF双框架实战:喷涂工艺SCADA上位机从0到1搭建(附采集监控源码+车间踩坑实录)
大数据·hadoop·wpf
hkNaruto11 天前
【大数据】《传统Hadoop大数据技术入门:补充与进阶——从数据格式到智能决策的问答实录》
大数据·hadoop·分布式
牛奶咖啡1312 天前
大数据Hadoop运维应用实践——双NameNode高可用Hadoop集群架构(下)
大数据·hadoop·hadoop集群配置文件解析·hadoop高可用集群安装部署·配置指定多台服务器相互免密·配置hadoop服务开机自启·ansible部署hadoop
李昊哲小课13 天前
spark4 集群安装
大数据·hadoop·zookeeper·spark
buligbulig13 天前
Hadoop环境安装和集群创建
大数据·hadoop·分布式
香山上的麻雀100814 天前
Hive内部表(MANAGED_TABLE)的“批量删除分区”特性详解
数据仓库·hive·hadoop