以下是基于 CentOS 8 搭建高可用 Hadoop 集群的完整操作流程及命令,涵盖 6 台主机的规划、部署步骤和高可用(HA)配置。结合 Hadoop 3.x 官方文档和最佳实践整理:
先决条件
- 硬件规划
- 6 台 CentOS 8 主机(物理机或虚拟机),每台建议配置:
- 4GB+ 内存,50GB+ 磁盘
- 静态 IP(示例规划):
- 6 台 CentOS 8 主机(物理机或虚拟机),每台建议配置:
主机名 | IP 地址 | 角色分配 |
---|---|---|
node1 | 192.168.1.101 | NameNode + ZKFC + JournalNode |
node2 | 192.168.1.102 | NameNode + ZKFC + JournalNode |
node3 | 192.168.1.103 | ResourceManager + JournalNode |
node4 | 192.168.1.104 | DataNode + NodeManager |
node5 | 192.168.1.105 | DataNode + NodeManager |
node6 | 192.168.1.106 | DataNode + NodeManager |
- 服务说明:
- JournalNode:存储 HA 状态(至少 3 台)
- ZKFC(ZooKeeper Failover Controller):监控 NameNode 状态38
- 软件要求
- Java JDK 1.8+(推荐 OpenJDK)
- Hadoop 3.3.4+(官网下载)
- ZooKeeper 3.6.3+(用于 HA 仲裁)810
一、基础环境配置(所有节点执行)
1. 网络与主机名
bash
# 设置静态 IP(以 node1 为例)
sudo nmcli con mod ens33 ipv4.addresses 192.168.1.101/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8" ipv4.method manual
sudo nmcli con up ens33
# 修改主机名
sudo hostnamectl set-hostname node1
# 配置 hosts 映射(所有节点相同)
sudo vi /etc/hosts
## 添加以下内容:
192.168.1.101 node1
192.168.1.102 node2
192.168.1.103 node3
192.168.1.104 node4
192.168.1.105 node5
192.168.1.106 node6
2. 关闭防火墙与 SELinux
bash
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3. 安装 JDK
bash
sudo dnf install java-1.8.0-openjdk-devel -y
echo 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk' | sudo tee -a /etc/profile
source /etc/profile
4. 配置 SSH 免密登录
bash
# 所有节点生成密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 在 node1 上汇总公钥并分发
ssh-copy-id node1
ssh-copy-id node2
... # 依次操作所有节点
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys node2:~/.ssh/ # 复制到其他节点
二、Hadoop 安装与 HA 配置
1. 解压 Hadoop 到所有节点
bash
# 在 node1 操作
tar -zxvf hadoop-3.3.4.tar.gz -C /opt
sudo mv /opt/hadoop-3.3.4 /opt/hadoop
# 分发到其他节点
scp -r /opt/hadoop node2:/opt/
... # 重复至 node6
2. 配置环境变量(所有节点)
bash
echo 'export HADOOP_HOME=/opt/hadoop' | sudo tee -a /etc/profile
echo 'export PATH=PATH:HADOOP_HOME/bin:$HADOOP_HOME/sbin' | sudo tee -a /etc/profile
source /etc/profile
3. 修改 Hadoop 配置文件($HADOOP_HOME/etc/hadoop/)
- core-site.xml - 定义全局 HA 访问点
xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> <!-- HA 逻辑名 -->
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value> <!-- ZK 集群 -->
</property>
</configuration>
- hdfs-site.xml - 配置 HA 和 JournalNode
xml
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> <!-- 与 core-site 一致 -->
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value> <!-- 两个 NameNode ID -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> <!-- JournalNode -->
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journal</value> <!-- JN 数据目录 -->
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value> <!-- 启用自动故障转移 -->
</property>
- workers - 指定 DataNode
plaintext
node4
node5
node6
- yarn-site.xml - 配置 YARN HA
xml
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node3</value> <!-- RM 主节点 -->
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node4</value> <!-- RM 备节点 -->
</property>
三、启动高可用集群
1. 启动 ZooKeeper(node1~node3)
bash
# 在 ZK 节点上
zkServer.sh start
2. 启动 JournalNode(node1~node3)
bash
hdfs --daemon start journalnode
3. 格式化并启动 NameNode HA
bash
# 在 node1 上格式化(首次)
hdfs namenode -format
hdfs zkfc -formatZK # 在 ZK 中初始化 HA 状态
# 启动 node1 的 NameNode
hdfs --daemon start namenode
# 在 node2 上同步元数据
hdfs namenode -bootstrapStandby
# 启动所有服务
start-dfs.sh # 启动 HDFS 集群
start-yarn.sh # 启动 YARN 集群
四、验证高可用功能
- 检查服务状态
bash
hdfs haadmin -getServiceState nn1 # 应返回 active
yarn rmadmin -getServiceState rm1 # 应返回 active
- 模拟故障转移
bash
# 手动杀死 active NameNode
kill -9 <NameNode_PID>
# 30秒内 ZKFC 应自动切换备节点为 active
hdfs haadmin -getServiceState nn2 # 验证是否变为 active
- Web UI 访问
- NameNode: http://node1:9870
- ResourceManager: http://node3:8088
五、关键运维命令
功能 | 命令示例 |
---|---|
手动切换 NameNode | hdfs haadmin -failover nn1 nn2 |
查看 JournalNode 状态 | hdfs dfsadmin -report |
修复数据块 | hdfs fsck / -delete |
添加新节点 | 将新主机加入 workers 并重启集群 |
注意:
- 所有配置文件修改后需同步到集群所有节点(可用 scp 分发)18。
- 高可用下需确保 JournalNode 和 ZK 服务奇数节点存活(至少 3 台)310。
- 生产环境建议配置 Kerberos 认证 和 磁盘 RAID 提升安全性。
完整操作流程参考:Hadoop 官方 HA 文档。