Hadoop学习---11、HA高可用

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Hadoop学习---11、HA高可用

1、Hadoop HA高可用

1.1 HA概述

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

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

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

(1)NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启。

(2)NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。

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

1.2 HDFS-HA核心问题

05f68e73a7884feea3c4c37855b11d87.png

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

(1)FsImage:让一台nn生成数据,让其他机器nn同步

(2)Edits:需要引进新的模块JournalNode来保证edits的文件的数据一致性。

2、怎么让同时只有一台nn是active吗,其它所有是standby的

(1)手动分配

(2)自动分配

3、2nn在ha架构中并不存在,定期合并FsImage和Edits的活谁来干?

有standby的nn来干

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

(1)手动故障转移

(2)自动故障转移

1.3 HDFS-HA手动模式

1.3.1 环境准备

1、修改IP

2、修改主机名和IP地址的映射

3、关闭防火墙

4、ssh免密登录

5、安装JDK,配置环境变量

1.3.2 规划集群

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
1.3.3配置HDFS-HA集群

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

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

cd /opt
sudo mkdir ha
sudo chown zhm:zhm /opt/ha

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

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

4、配置core-site.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

<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/atguigu/.ssh/id_rsa</value>
  </property>
</configuration>

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

1.3.4 启动HDFS-HA集群

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

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

填入内容:

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

然后再三台机器上source环境变量

source /etc/profile

2、在各个JournalNode(每台机器)节点上,输入以下命令启动JournalNode服务

hdfs --daemon  start journalnode

3、在[nn1]上,对其进行格式化,并启动

hdfs namenode -format
hdfs --daemon start namenode

4、在[nn2]和[nn3]上同步nn1的元数据信息

hdfs namenode -bootstrapStandby

5、启动[nn2]和[nn3]

hdfs --daemon start namenode

6、查看web页面显示

hadoop102

4c4f8d8b2ce8440ab48e066864d8342e.png

hadoop103


b120c02ae49440068134e29b8984a2fb.png


hadoop104


d0dbfb14436d455299eea6cce8e4faea.png

7、在所有节点上启动DataNode

hdfs --daemon start datanode

8、将[nn1]切换为active

hdfs haadmin -transitionToActive nn1

9、查看是否Active

hdfs haadmin -getServiceState nn1

1.4 HDFS-HA 自动模式

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

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

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

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
Zookeeper Zookeeper Zookeeper
ZKFC ZKFC ZKFC

1.4.3 配置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)修改之后分发配置文件

2、启动

(1)关闭所有HDFS服务:

stop-dfs.sh

(2)启动Zookeeper集群(没有配置一键启动的话,就去每个节点启动一次)

zkServer.sh start

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

hdfs zkfc -formatZK

(4)启动HDFS服务

start-dfs.sh

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

get -s /hadoop-ha/mycluster/ActiveStandbyElectorLock

3、验证

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

1.5 Yarn-HA配置

1.5.1 Yarn-HA工作机制

28486ad96b2d4b5a98555edf03684dd9.png

1.5.2 配置Yarn-HA集群

1、环境准备

(1)修改IP

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

(3)关闭防火墙

(4)ssh免密登录

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

(6)配置Zookeeper集群

2、规划集群

hadoop102 hadoop103 hadoop104
ResourceManager ResourceManager ResourceManager
NodeManager NodeManager NodeManager
Zookeeper Zookeeper Zookeeper

3、核心问题

(1)如果当前Active rm挂了,其他rm怎么将其它standby rm 上位。

核心原理和HDFS一样,利用了zk的临时节点

(2)当前rm上有很多的计算程序在等待运行,其他的rm怎么将这些程序接手过来接着跑

rm会将当前的所有计算程序的状态存储在zk中,其他rm上位后会去读取,然后接着跑。

4、具体配置

(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,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)同步更新其他节点的配置信息,分发配置文件

4、启动Yarn

(1)在有ResourceManager的节点启动。

start-yarn.sh

(2)查看服务状态

yarn rmdamin -getServiceState rm1

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

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

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

1.6 Hadoop HA的最终规划

将整个ha搭建完成后,集群将形成以下模样

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


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
存储 分布式计算 资源调度
41 Hadoop的HA机制
41 Hadoop的HA机制
61 0
41 Hadoop的HA机制
|
分布式计算 运维 Hadoop
42 Hadoop的HA集群的安装部署
42 Hadoop的HA集群的安装部署
113 0
|
6月前
|
存储 分布式计算 资源调度
Hadoop【环境搭建 04】【hadoop-2.6.0-cdh5.15.2.tar.gz 基于ZooKeeper搭建高可用集群】(部分图片来源于网络)
【4月更文挑战第1天】Hadoop【环境搭建 04】【hadoop-2.6.0-cdh5.15.2.tar.gz 基于ZooKeeper搭建高可用集群】(部分图片来源于网络)
190 3
|
15天前
|
分布式计算 资源调度 Hadoop
【赵渝强老师】基于ZooKeeper实现Hadoop HA
本文介绍了如何在4个节点(bigdata112、bigdata113、bigdata114和bigdata115)上部署HDFS高可用(HA)架构,并同时部署Yarn的HA。详细步骤包括环境变量设置、配置文件修改、ZooKeeper集群启动、JournalNode启动、HDFS格式化、ZooKeeper格式化以及启动Hadoop集群等。最后通过jps命令检查各节点上的后台进程,确保部署成功。
|
1月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
61 1
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
46 4
|
1月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
37 2
|
3月前
|
机器学习/深度学习 存储 分布式计算
Hadoop高可用集群搭建
Hadoop高可用集群搭建
|
5月前
|
存储 分布式计算 监控
分布式系统详解--框架(Hadoop-HDFS的HA搭建及测试)
分布式系统详解--框架(Hadoop-HDFS的HA搭建及测试)
65 0
|
6月前
|
分布式计算 Ubuntu Hadoop
【分布式计算框架】hadoop全分布式及高可用搭建
【分布式计算框架】hadoop全分布式及高可用搭建
127 1

相关实验场景

更多
下一篇
无影云桌面