一、注意事项
免密登录:确保所有节点间 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
内容:
<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. 手动故障转移测试
步骤:
- 停止 Active 节点的 Namenode:
hadoop-daemon.sh stop namenode # 在bigdata01执行
- 观察 bigdata02 是否自动切换为 Active(通过网页或命令行验证)。
- 重启 bigdata01 的 Namenode,应自动变为 Standby。