温馨提示×

centos怎么配hdfs高可用

小樊
47
2026-09-27 14:24:22
栏目: 智能运维

下面给你一份**在 CentOS 上配置 HDFS 高可用(HA)**的实战步骤说明,基于 Hadoop 3.x(社区主流版本),使用 JournalNode + ZKFC + ZooKeeper 方案(最常用)。


一、HDFS HA 架构说明(先理解)

HDFS HA 核心组件:

  • NameNode(Active / Standby):两个 NameNode
  • JournalNode(JN):至少 3 个,共享 EditLog
  • ZooKeeper(ZK):协调与自动故障转移
  • ZKFC(ZK Failover Controller):监控 NN 状态并切换

典型节点规划(示例):

节点 角色
node1 NameNode(Active), JournalNode, ZK
node2 NameNode(Standby), JournalNode, ZK
node3 JournalNode, ZK
node4 DataNode
node5 DataNode

二、基础环境准备(所有节点)

1. 系统环境

# 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

2. 配置 hosts

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

3. 配置 SSH 免密(NameNode 之间必须)

ssh-keygen -t rsa
ssh-copy-id node1
ssh-copy-id node2

4. 安装 JDK

yum install -y java-1.8.0-openjdk-devel

三、ZooKeeper 安装(3 节点)

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

四、Hadoop HA 核心配置

1. core-site.xml

<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>

2. hdfs-site.xml

<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>

五、初始化 HA 集群(顺序很重要)

1. 启动 JournalNode

hdfs --daemon start journalnode

2. 格式化 NameNode(仅第一次)

hdfs namenode -format

3. 初始化 ZKFC

hdfs zkfc -formatZK

4. 同步 Standby NameNode

# 在 node2 执行
hdfs namenode -bootstrapStandby

5. 启动 HDFS

start-dfs.sh

六、验证 HA

查看状态

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

模拟故障转移

# 杀掉 Active NameNode
kill -9 <nn pid>

# 观察 Standby 是否变为 Active
hdfs haadmin -getServiceState nn2

七、常见问题

✅ ZKFC 不切换

  • 检查 SSH 免密
  • 检查 ZooKeeper 是否可用

✅ JournalNode 不一致

  • 删除 /data/journalnode 重新初始化

✅ 端口冲突

  • 9870 / 8020 / 8485 / 2181

如果你愿意,我可以:

  • ✅ 给你一份 完整可复制的配置文件
  • ✅ 按 CentOS 7 最小化实操步骤
  • ✅ 帮你做 HA + YARN HA

你现在是 测试环境还是生产环境?

0 踩