下面给你一份**在 CentOS 上配置 HDFS 高可用(HA)**的实战步骤说明,基于 Hadoop 3.x(社区主流版本),使用 JournalNode + ZKFC + ZooKeeper 方案(最常用)。
HDFS HA 核心组件:
典型节点规划(示例):
| 节点 | 角色 |
|---|---|
| node1 | NameNode(Active), JournalNode, ZK |
| node2 | NameNode(Standby), JournalNode, ZK |
| node3 | JournalNode, ZK |
| node4 | DataNode |
| node5 | DataNode |
# CentOS 7/8 示例
hostnamectl set-hostname node1
# 关闭防火墙(生产可用安全组替代)
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
cat >> /etc/hosts <<EOF
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
192.168.1.14 node4
192.168.1.15 node5
EOF
ssh-keygen -t rsa
ssh-copy-id node1
ssh-copy-id node2
yum install -y java-1.8.0-openjdk-devel
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt
cd /opt/zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
zoo.cfg 关键配置:
dataDir=/data/zookeeper
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
mkdir -p /data/zookeeper
echo 1 > /data/zookeeper/myid # node1=1, node2=2...
启动:
bin/zkServer.sh start
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
<configuration>
<!-- 集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- NameNode ID -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode RPC -->
<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>
<!-- HTTP -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:9870</value>
</property>
<!-- JournalNode -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/journalnode</value>
</property>
<!-- 故障转移 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>
hdfs --daemon start journalnode
hdfs namenode -format
hdfs zkfc -formatZK
# 在 node2 执行
hdfs namenode -bootstrapStandby
start-dfs.sh
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 杀掉 Active NameNode
kill -9 <nn pid>
# 观察 Standby 是否变为 Active
hdfs haadmin -getServiceState nn2
✅ ZKFC 不切换
✅ JournalNode 不一致
/data/journalnode 重新初始化✅ 端口冲突
如果你愿意,我可以:
你现在是 测试环境还是生产环境?