前言

在大数据生产环境中,Hadoop 集群是整个数据体系的基石。HDFS 负责存储,YARN 负责调度,一旦核心组件宕机,整个数据仓库、实时计算、离线任务都会全面瘫痪。

传统单 NameNode、单 ResourceManager 架构存在严重的  单点故障(SPOF) 问题:

  • NameNode 挂掉 → HDFS 不可用
  • ResourceManager 挂掉 → 所有计算任务无法调度

Hadoop HA(High Availability)高可用方案,就是为了解决单点故障而生。通过主备冗余、自动故障切换、元数据实时同步,让集群在节点宕机、进程异常、硬件故障等场景下依然稳定服务,真正做到业务不中断、集群永不宕机

本文将从原理、架构、核心组件、部署步骤、运维命令、常见问题等方面,完整讲解 Hadoop HA,内容偏生产实战,适合学习、面试、搭建参考。

一、为什么必须使用 Hadoop HA?

在非 HA 模式下:

  1. NameNode 是 HDFS 唯一入口,一旦宕机,整个文件系统不可读写。
  2. ResourceManager 是 YARN 大脑,挂掉后任务无法提交、无法恢复。
  3. 人工重启、切换效率极低,生产环境无法接受长时间不可用。
  4. 无法满足 7×24 小时高可用要求。

Hadoop HA 的核心价值:

  • 核心组件主备部署,避免单点
  • 故障自动检测、自动切换,无需人工介入
  • 切换过程秒级完成,业务无感知
  • 数据不丢失、服务不中断

可以说:没有 HA 的 Hadoop 集群,不能称之为生产集群。


二、Hadoop HA 整体架构

Hadoop HA 主要包括两大部分:

  1. HDFS HA:解决 NameNode 单点故障
  2. 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)

流程:

  1. Active NN 写入 edits 日志到 JournalNode 集群
  2. 大多数 JournalNode 写入成功即认为成功
  3. Standby NN 从 JournalNode 拉取日志并同步内存元数据
  4. 主备元数据保持实时一致

QJM 替代传统 NFS,更稳定、更可靠、无脑裂风险。

2. 故障切换:ZKFC + ZooKeeper

每台 NameNode 节点会启动一个 ZKFailoverController(ZKFC) 进程。

工作机制:

  1. ZKFC 监控本地 NameNode 健康状态
  2. 向 ZooKeeper 抢占锁
  3. 抢占成功 → 节点变为 Active
  4. 若 Active 宕机,ZK 会话失效,触发重新选举
  5. 新的主节点自动升级为 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 真正做到永不宕机。

更多推荐