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

一、注意事项

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

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

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

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

二、环境准备

1. 服务器规划

节点 角色 软件依赖
bigdata01 Namenode1、JournalNode、ZooKeeper Hadoop、JDK、ZooKeeper
bigdata02 Namenode2、JournalNode、ZooKeeper Hadoop、JDK、ZooKeeper
bigdata03 JournalNode、ZooKeeper、DataNode Hadoop、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
内容


  
  
    hadoop.tmp.dir
    /opt/installs/hadoop/tmp
  
  
  
    fs.defaultFS
    hdfs://hdfs-cluster
  
  
  
    ha.zookeeper.quorum
    bigdata01:2181,bigdata02:2181,bigdata03:2181
  

7. 配置 hdfs-site.xml

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


  
  
    dfs.replication
    3
  
  
  
    dfs.nameservices
    hdfs-cluster
  
  
  
    dfs.ha.namenodes.hdfs-cluster
    nn1,nn2
  
  
  
    dfs.namenode.rpc-address.hdfs-cluster.nn1
    bigdata01:9820
  
  
    dfs.namenode.http-address.hdfs-cluster.nn1
    bigdata01:9870
  
  
  
    dfs.namenode.rpc-address.hdfs-cluster.nn2
    bigdata02:9820
  
  
    dfs.namenode.http-address.hdfs-cluster.nn2
    bigdata02:9870
  
  
  
    dfs.journalnode.edits.dir
    /opt/installs/journalnode/data/
  
  
  
    dfs.namenode.shared.edits.dir
    qjournal://bigdata01:8485;bigdata02:8485;bigdata03:8485/hdfs-cluster
  
  
  
    dfs.ha.automatic-failover.enabled
    true
  
  
  
    dfs.client.failover.proxy.provider.hdfs-cluster
    org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
  
  
  
    dfs.ha.fencing.methods
    sshfence
  
  
    dfs.ha.fencing.ssh.private-key-files
    /root/.ssh/id_rsa
  
  
  
    dfs.webhdfs.enabled
    true
  

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。

你可能感兴趣的:(hadoop,大数据,分布式)