手把手教你搭建 Hadoop Namenode 高可用集群(HA)

一、注意事项

免密登录:确保所有节点间 SSH 免密登录正常,否则故障转移会失败。

路径一致性:所有节点的 Hadoop 安装路径、数据目录需完全一致。

端口冲突:检查 9820、9870、8485 等端口是否被占用。

ZooKeeper 集群:确保 ZK 集群稳定运行,至少 3 个节点避免脑裂。

二、环境准备

1. 服务器规划

节点角色软件依赖
bigdata01Namenode1、JournalNode、ZooKeeperHadoop、JDK、ZooKeeper
bigdata02Namenode2、JournalNode、ZooKeeperHadoop、JDK、ZooKeeper
bigdata03JournalNode、ZooKeeper、DataNodeHadoop、JDK、ZooKeeper

2. 前置操作

重要:先对三台服务器拍摄快照,以便搭建失败时快速恢复!

三、核心步骤详解

1. 配置节点间免密登录

目标:确保 bigdata01 和 bigdata02 可免密登录所有节点(包括自身)。
操作

# 在bigdata02节点生成密钥对
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
# 分发公钥到所有节点(包括bigdata01、bigdata02、bigdata03)
ssh-copy-id bigdata01
ssh-copy-id bigdata02
ssh-copy-id bigdata03

2. 安装 psmisc 工具

作用:提供killall命令,用于 ZKFC 远程杀死假死的 Namenode 进程。
操作:通过 xcall 脚本在所有节点安装(bigdata01 已配置 xcall):

xcall.sh yum install -y psmisc

3. 检查基础环境

# 检查JDK安装(所有节点)
java -version
# 检查ZooKeeper状态(所有节点)
zkServer.sh status

4. 清理旧 Hadoop 数据(若有)

# 停止集群
stop-all.sh
# 删除数据和日志目录(所有节点)
xcall.sh rm -rf /opt/installs/hadoop/tmp/ /opt/installs/hadoop/logs/

5. 配置 hadoop-env.sh

路径/opt/installs/hadoop/etc/hadoop/hadoop-env.sh
内容

export JAVA_HOME=/opt/installs/jdk/ 
export HDFS_NAMENODE_USER=root
# 其他服务用户配置(如Datanode、ZKFC等)
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root

同步配置

xsync.sh hadoop-env.sh  # 同步到bigdata02和bigdata03

6. 配置 core-site.xml

路径/opt/installs/hadoop/etc/hadoop/core-site.xml
内容

<configuration>
  <!-- Hadoop临时目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/installs/hadoop/tmp</value>
  </property>
  <!-- HDFS逻辑入口(虚拟地址) -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdfs-cluster</value>
  </property>
  <!-- ZooKeeper集群地址 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>
  </property>
</configuration>

7. 配置 hdfs-site.xml

路径/opt/installs/hadoop/etc/hadoop/hdfs-site.xml
内容

<configuration>
  <!-- 副本数 -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <!-- 命名服务名称 -->
  <property>
    <name>dfs.nameservices</name>
    <value>hdfs-cluster</value>
  </property>
  <!-- 命名服务下的Namenode节点 -->
  <property>
    <name>dfs.ha.namenodes.hdfs-cluster</name>
    <value>nn1,nn2</value>
  </property>
  <!-- NN1的RPC和HTTP地址 -->
  <property>
    <name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
    <value>bigdata01:9820</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hdfs-cluster.nn1</name>
    <value>bigdata01:9870</value>
  </property>
  <!-- NN2的RPC和HTTP地址 -->
  <property>
    <name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
    <value>bigdata02:9820</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hdfs-cluster.nn2</name>
    <value>bigdata02:9870</value>
  </property>
  <!-- JournalNode数据存储目录 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/installs/journalnode/data/</value>
  </property>
  <!-- 共享编辑日志地址(QJM协议) -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/hdfs-cluster</value>
  </property>
  <!-- 开启自动故障转移 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <!-- 故障转移代理类 -->
  <property>
    <name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <!-- 节点隔离方式(SSH免密杀进程) -->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>
  <!-- 启用WebHDFS -->
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
</configuration>

8. 检查 DataNode 节点(workers 文件)

确保/opt/installs/hadoop/etc/hadoop/workers包含所有 DataNode 节点(如 bigdata03)。

9. 同步配置文件

xsync.sh core-site.xml hdfs-site.xml  # 同步到bigdata02和bigdata03

四、集群启动与初始化

1. 启动 ZooKeeper 集群

zk.sh start  # 所有节点启动ZK(若已配置脚本)

2. 初始化 ZKFC 的 Znode(仅需一次)

在 bigdata01 执行:

hdfs zkfc -formatZK

3. 启动 JournalNode 服务(所有节点)

hdfs --daemon start journalnode

4. 格式化 Namenode(仅主节点)

在 bigdata01 执行:

hdfs namenode -format

5. 启动 HDFS 集群

start-dfs.sh  # 自动启动Namenode、DataNode、JournalNode

6. 初始化 Standby Namenode(bigdata02 仅首次执行)

# 引导Standby节点同步元数据
hdfs namenode -bootstrapStandby
# 启动bigdata02的Namenode
hadoop-daemon.sh start namenode

五、测试

1. 查看 Namenode 状态

网页访问:

Active 节点:http://bigdata01:9870

Standby 节点:http://bigdata02:9870

命令行查看:
# 在任意节点执行
hdfs haadmin -getServiceState nn1  # 查看nn1状态(active/standby)
hdfs haadmin -getServiceState nn2  # 查看nn2状态

2. 手动故障转移测试

步骤:
  1. 停止 Active 节点的 Namenode:
    hadoop-daemon.sh stop namenode  # 在bigdata01执行
    
  2. 观察 bigdata02 是否自动切换为 Active(通过网页或命令行验证)。
  3. 重启 bigdata01 的 Namenode,应自动变为 Standby。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值