第 1 章:Hadoop HA 高可用
1.1 HA 概述
所谓HA(High Availablity),即高可用(7*24小时不间断服务)。
实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。
NameNode主要在以下两个方面影响HDFS集群
- NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启。
- NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。
HDFS HA功能通过配置多个NameNodes(Activate/Standby)实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器奔溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
解释名词:
HDFS(Hadoop Distributed File System):
- 定义:HDFS是Hadoop框架中的一个分布式系统,它被设计用来存储大量数据,并提供高吞吐量的数据访问。这个系统可以跨越多个机器运行,使得它可以处理大量数据。
- 特点:HDFS是一个主/从结构。一个HDFS集群由一个NameNode(主节点)和多个DataNodes(从节点)组成。NameNode管理文件系统的元数据,比如文件目录和文件属性,同时还负责客户端请求的处理。DataNodes则负责存储实际的数据。
- 用途:主要用于大数据应用,特别是那些需要处理PB级(千亿字节)数据的应用。
YARN(Yet Another Resource Negotiator):
- 定义:YARN是Hadoop2.0引入的资源管理和作业调度技术。它允许数据处理框架(如MapReduce和其它分布式计算框架)有效地共享一个共同的资源池。
- 组件:主要包括ResourceManager(负责整个系统的资源分配)和多个NodeManagers(在每个节点上管理用户作业运行)。
- 目的:YARN的目的是提高集群的资源利用率,同时支持多种数据处理模型。
NameNode:
- 角色:在HDFS中,NameNode是一个关键的服务器,负责管理文件系统的命名空间和客户端对文件的访问。NameNode记录了每个文件在文件系统树的目录结构中的位置,以及文件的元数据,如权限、时间戳等。
- 功能:NameNode还记录了每个文件的数据块(block)信息和这些数据块在DataNodes上的位置。但是它并不存储实际的数据。
1.2 HDFS-HA核心问题
4 强行杀死namenode~ + 5 如果ssh补刀失败~:强行再补一刀,防止同时出现两个活着的NameNode,也就出现了脑裂。
1)怎么保证三台namenode的数据一致?
(1)Fsimage:让一台nn生成数据,让其它机器nn同步。
(2)Edits:需要引进新的模块JournalNode来保证edits的文件的数据一致性。
2)怎么同时只有一台nn是active,其它所有的是standby?
(1)手动分配
(2)自动分配
3)2nn在ha架构中并不存在,定期合并fsimage和edits的活谁来干?
(1)由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集群
- 在opt目录下创建一个ha文件夹
- 将/opt/module/下的hadoop拷贝到/opt/ha目录下(记得删除data和log目录)
- 配置core-site.xml
(1)把多个NameNode的地址组装成一个集群mycluster
(2)指定hadoop运行时产生文件的存储目录 - 配置hdfs-site.xml
(1)NameNode数据存储目录
(2)DataNode数据存储目录
(3)JournalNode数据存储目录
(4)完全分布式集群名称
(5)集群中NameNode节点都有哪些
(6)NameNode的RPC通信地址:RPC通信是一种允许远程计算机程序调用另一台计算机上程序的协议,主要用于数据管理、元数据操作以及各种控制指令的传输。
(7)NameNode的http通信地址:用于Web界面访问,供管理员和用户查看文件系统状态和性能指标。
(8)指定NameNode元数据在JournalNode上的存储地址
(9)访问代理类:client用于确定哪个NameNode为Active
(10)配置隔离机制,即同一时刻只能有一台服务器对外响应
(11)使用隔离机制时需要ssh密钥登录 - 分发配置好的hadoop环境到其它节点
1.3.4 启动HDFS-HA集群
1)将HADOOP_HOME环境变量更改到HA目录(三台机器)
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页面显示
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故障自动转移
(2)在core-site.xml文件中增加:指定zkfc要连接的zkService地址
(3)修改后分发配置文件
2)启动
(1)关闭所有HDFS服务
(2)启动Zookeeper集群
- zkServer.sh start
(3)初始化HA在Zookeeper中状态
- hdfs zkfc -formatZK
(4)启动HDFS
(5)可以去zkCli.sh客户端查看Namenode选举锁节点内容
3)验证
(1)将Active NameNode进程kill,查看网页端三台Namenode的状态变化
1.5 YARN-HA配置
1.5.1 YARN-HA工作机制
ZooKeeper集群存储了Active ResourceManager的状态,这样在主节点失败时,可以从ZooKeeper获取状态信息,以便进行故障转移。Standby ResourceManager是备用的ResourceManager,它在正常情况下不会处理任何作业或管理资源。当Active ResourceManager发生故障时,Standby ResourceManager会从ZooKeeper集群获取最新的状态信息,并成为新的Active ResourceManager,这个过程称为故障转移(Fail-over)。
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
- 1、启用resourcemanager ha
- 2、声明两台resourcemanager的地址
- 3、指定resourcemanager的逻辑顺序
- 4、rm1的配置(指定rm1的主机名、指定rm1的web端地址、指定rm1的内部通信地址、指定AM向rm1申请资源的地址、指定供NM连接的地址)
- 5、rm2的配置:和rm1的配置一致
- 6、rm3的配置:和rm1的配置一致
- 7、指定zookeeper集群的地址
- 8、启动自动恢复
- 9、指定resourcemanager的状态信息存储在zookeeper集群
- 10、环境变量继承
(2)同步更新其他节点信息的配置信息,分发配置文件
4)启动YARN
(1)在有ResourceManager的节点启动
(2)查看服务状态
- yarn rmadmin -getServiceState rm1
(3)可以去zkCli.sh客户端查看ResourceManager选举锁节点内容
(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 |
NameNode:Hadoop文件系统(HDFS)的核心部分,负责管理文件系统的命名空间。NameNode跟踪整个文件系统的目录和文件结构,并维护文件系统树及其元数据。在Ha配置中,通常由两个NameNode,一个处于活跃状态,另外一个处于待命状态,以提供故障转移能力。
JournalNode:在Ha配置中,JournalNode用于维护NameNode之间的状态同步。当活动NameNode对文件进行更改时,这个更改会先记录到一组JournalNode中,然后由待命NameNode读取,以保持状态一致。
DataNode:HDFS的数据存储节点。DataNode负责存储实际的数据块。NameNode负责跟踪哪个DataNode存储了文件的哪部分内容。
Zookeeper:一种集中式服务,用于维护配置信息、命令、提供分布式同步,以及提供群组服务。 在Hadoop HA配置中,Zookeeper用于管理和协调NameNode的状态。
ZKFC(Zookeeper Failover Controller):ZKFC是一个基于Zookeeper的故障转移控制器。它监控和管理NameNode的健康状态,以及在主NameNode失效时触发故障转移功能。
ResourceManager:YARN(Yet Another Resource Negotiator)的核心部分,负责管理集群中的计算资源。ResourceManager跟踪可用的处理器和内存资源,并根据需求将这些资源分配给各个应用程序。
NodeManager:YARN架构中的每个节点上运行的组件。NodeManager负责监控其节点上的资源使用情况,并向ResourceManager报告。此外,它还负责管理容器的生命周期,容器是执行应用程序代码的隔离环境。