Hadoop HA:让集群永不宕机
前言
在大数据生产环境中,Hadoop 集群是整个数据体系的基石。HDFS 负责存储,YARN 负责调度,一旦核心组件宕机,整个数据仓库、实时计算、离线任务都会全面瘫痪。
传统单 NameNode、单 ResourceManager 架构存在严重的 单点故障(SPOF) 问题:
- NameNode 挂掉 → HDFS 不可用
- ResourceManager 挂掉 → 所有计算任务无法调度
Hadoop HA(High Availability)高可用方案,就是为了解决单点故障而生。通过主备冗余、自动故障切换、元数据实时同步,让集群在节点宕机、进程异常、硬件故障等场景下依然稳定服务,真正做到业务不中断、集群永不宕机。
本文将从原理、架构、核心组件、部署步骤、运维命令、常见问题等方面,完整讲解 Hadoop HA,内容偏生产实战,适合学习、面试、搭建参考。
一、为什么必须使用 Hadoop HA?
在非 HA 模式下:
- NameNode 是 HDFS 唯一入口,一旦宕机,整个文件系统不可读写。
- ResourceManager 是 YARN 大脑,挂掉后任务无法提交、无法恢复。
- 人工重启、切换效率极低,生产环境无法接受长时间不可用。
- 无法满足 7×24 小时高可用要求。
Hadoop HA 的核心价值:
- 核心组件主备部署,避免单点
- 故障自动检测、自动切换,无需人工介入
- 切换过程秒级完成,业务无感知
- 数据不丢失、服务不中断
可以说:没有 HA 的 Hadoop 集群,不能称之为生产集群。
二、Hadoop HA 整体架构
Hadoop HA 主要包括两大部分:
- HDFS HA:解决 NameNode 单点故障
- YARN HA:解决 ResourceManager 单点故障
两者都依赖 ZooKeeper 实现分布式协调:选举、锁、状态监听。
典型集群规划(生产标准)
- ZooKeeper 集群:3 节点
- JournalNode 集群:3 节点
- NameNode:2 节点(Active + Standby)
- ResourceManager:2 节点(Active + Standby)
- DataNode、NodeManager:多台

三、HDFS HA 原理详解
HDFS HA 采用 一主一备 架构:
- Active NameNode:对外提供服务,处理客户端读写
- Standby NameNode:同步元数据,时刻准备切换
1. 元数据同步:QJM 机制
为了保证主备 NameNode 元数据一致,Hadoop 使用 QJM(Quorum Journal Manager)。
流程:
- Active NN 写入 edits 日志到 JournalNode 集群
- 大多数 JournalNode 写入成功即认为成功
- Standby NN 从 JournalNode 拉取日志并同步内存元数据
- 主备元数据保持实时一致
QJM 替代传统 NFS,更稳定、更可靠、无脑裂风险。
2. 故障切换:ZKFC + ZooKeeper
每台 NameNode 节点会启动一个 ZKFailoverController(ZKFC) 进程。
工作机制:
- ZKFC 监控本地 NameNode 健康状态
- 向 ZooKeeper 抢占锁
- 抢占成功 → 节点变为 Active
- 若 Active 宕机,ZK 会话失效,触发重新选举
- 新的主节点自动升级为 Active
整个切换自动完成,无需人工操作。
四、YARN HA 原理
YARN HA 相对简单,同样基于主备模式:
- 多个 ResourceManager,只有一个 Active
- RM 状态信息存储在 ZooKeeper
- 应用程序、队列信息持久化到 ZK
- 主节点故障后,备节点自动接管并恢复任务
不需要 JournalNode,依赖 ZK 完成选举与状态同步。
五、Hadoop HA 核心配置文件(可直接复制使用)
搭建namenode的高可用
以下为生产常用配置,只展示关键部分。
1. core-site.xml
<!--hdfs集群的文件位置-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/installs/hadoop3.1.4/data</value>
</property>
<!--hdfs入口,设置虚拟地址,具体地址后面配置-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdfs-cluster</value>
</property>
<!--hdfs要访问zookeeper集群-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop11:2181,hadoop12:2181,hadoop13:2181</value>
</property>
2. hdfs-site.xml
<!-- 定义hdfs入口的命名服务 -->
<property>
<name>dfs.nameservices</name>
<value>hdfs-cluster</value>
</property>
<!-- 定义hdfs入口的命名服务下虚拟ip-->
<property>
<name>dfs.ha.namenodes.hdfs-cluster</name>
<value>nn1,nn2</value>
</property>
<!-- 虚拟ip地址1 RPC入口 -->
<property>
<name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
<value>hadoop11:8020</value>
</property>
<!-- 虚拟ip地址1 HTTP入口 -->
<property>
<name>dfs.namenode.http-address.hdfs-cluster.nn1</name>
<value>hadoop11:9870</value>
</property>
<!-- 虚拟ip地址2 PRC入口 -->
<property>
<name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
<value>hadoop12:8020</value>
</property>
<!-- 虚拟ip地址1 HTTP入口 -->
<property>
<name>dfs.namenode.http-address.hdfs-cluster.nn2</name>
<value>hadoop12:9870</value>
</property>
<!-- 定义QJN在linux中保存文件磁盘目录 -->
<property>
<!-- Journal Edit Files 的存储目录:() -->
<name>dfs.journalnode.edits.dir</name>
<value>/opt/installs/journalnode/data/</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop11:8485;hadoop12:8485;hadoop13:8485/hdfs-cluster</value>
</property>
<!-- 是否开启故障切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 基于zookeeper的故障切换的代码类 -->
<property>
<name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 远程杀死namenode方式(防止namenode假死,导致双主出现) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 指定私钥的文件目录,使用免密登录杀死NN进程 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 可以在hdfs上点击结果查看-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
同步 core-site.xml 和 hdfs-site.xml到集群上去
六、HA 集群初始化与启动步骤
1. 启动 ZooKeeper
zk.sh start
2. 初始化ZKFC在zk中的Znode信息【第一次启动需要做】在hadoop11上进行即可
hdfs zkfc -formatZK
3、在三台服务器上启动jn【journalnode 主要用于存储namenode的元数据】
xcall hdfs --daemon start journalnode
4、对集群进行namenode的格式化
hdfs namenode -format
5、启动hdfs
start-dfs.sh
6、启动第二个namenode 需要在hadoop12上运行:
第一次需要运行如下命令,以后不需要:
hdfs namenode -bootstrapStandby
接着,启动第二个namenode:
hdfs --daemon start namenode
7.综上所述:
只要配置好了以后,以后启动高可用,命令只需要执行 start-dfs.sh 即可。当然zk还是单独管理

七、 搭建resourcemanager的高可用
第一步:检查mapred-site.xml ,里面只有yarn配置和historyServer的配置,不需要修改
第二步:yarn-site.xml
<!--配置resourcemanager的HA-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- RM 集群标识 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster</value>
</property>
<!-- RM 的逻辑 ID 列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- RM1 的主机地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop11</value>
</property>
<!-- RM1 的主机web管理界面地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop11:8088</value>
</property>
<!-- RM2 的主机地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop12</value>
</property>
<!-- RM2 的主机web管理界面地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop12:8088</value>
</property>
<!-- ZooKeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop11:2181,hadoop12:2181,hadoop13:2181</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 用于yarn故障转移持久化zk的类 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
第三步:将mapred-site.xml 和 yarn-site.xml进行同步
第四步:启动yarn
start-yarn.sh

第五步:查看状态
yarn rmadmin -getAllServiceState
八、常见问题与坑(生产避坑指南)
1. JournalNode 未启动导致 NN 无法同步
- 现象:备节点元数据滞后
- 解决:确保 3 台 JN 正常运行
2. ZooKeeper 异常导致无法选举
- 现象:双 Standby 或双 Active
- 解决:检查 ZK 集群状态、网络、防火墙
3. 免密不通导致 fencing 失败
- 现象:切换卡住
- 解决:配置 SSH 免密登录
4. 脑裂问题(双 Active)
- 原因:网络抖动、ZK 超时
- 解决:开启 sshfence,确保 fencing 机制生效
5. DataNode 未注册到新 Active NN
- 解决:重启 DataNode 或等待自动重连
九、总结
Hadoop HA 是生产级大数据集群的必备基础架构。
- HDFS HA 通过 QJM + ZKFC 实现 NameNode 高可用
- YARN HA 通过 ZooKeeper 实现 ResourceManager 高可用
- 故障自动切换,秒级恢复
- 业务无感知、数据不丢失、服务不中断
一句话收尾:搭建 Hadoop HA,就是给集群装上双保险,让 Hadoop 真正做到永不宕机。
更多推荐
所有评论(0)