温馨提示×

centos怎样配置hdfs高可用

小樊
52
2026-09-03 08:56:00
栏目: 智能运维

下面以 CentOS 7/8 + Hadoop HDFS HA(基于 QJM) 为例,说明 HDFS 高可用(High Availability) 的配置步骤。这是生产环境最常用的方式。


一、HDFS HA 架构说明(QJM 方式)

角色说明:

  • NameNode(Active / Standby):2 个 NN
  • JournalNode:至少 3 个(奇数)
  • ZKFC(DFSZKFailoverController):每个 NN 一个
  • ZooKeeper:至少 3 台
  • DataNode:多个
Client
  |
NameNode(Active) <---> NameNode(Standby)
  |                     |
JournalNode x3
  |
ZooKeeper x3

二、环境准备(CentOS)

1. 主机规划示例

nn1: 192.168.1.11
nn2: 192.168.1.12
jn1: 192.168.1.13
jn2: 192.168.1.14
jn3: 192.168.1.15
dn1: 192.168.1.16
zk1: 192.168.1.17
zk2: 192.168.1.18
zk3: 192.168.1.19

2. 基础配置(所有节点)

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 配置 hosts
cat >> /etc/hosts <<EOF
192.168.1.11 nn1
192.168.1.12 nn2
192.168.1.13 jn1
192.168.1.14 jn2
192.168.1.15 jn3
EOF

# 配置 SSH 免密(NN 之间必须)
ssh-keygen -t rsa
ssh-copy-id nn1
ssh-copy-id nn2

三、安装 ZooKeeper(3 台)

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt

zoo.cfg

tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
echo 1 > /data/zookeeper/myid  # zk1
# zk2 -> 2, zk3 -> 3

四、Hadoop HA 配置

1. core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>zk1:2181,zk2:2181,zk3:2181</value>
  </property>
</configuration>

2. hdfs-site.xml(重点)

<configuration>

  <!-- 名称服务 -->
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>

  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>

  <!-- NameNode RPC -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>nn1:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>nn2:8020</value>
  </property>

  <!-- HTTP -->
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>nn1:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>nn2:9870</value>
  </property>

  <!-- JournalNode -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value>
  </property>

  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/data/journalnode</value>
  </property>

  <!-- 故障转移 -->
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

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

  <!-- 自动故障转移 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>

</configuration>

五、启动顺序(非常重要)

1. 启动 ZooKeeper

zkServer.sh start

2. 启动 JournalNode(3 台)

hdfs --daemon start journalnode

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

# 在 nn1
hdfs namenode -format
hdfs zkfc -formatZK

4. 同步 Standby NN

# 在 nn2
hdfs namenode -bootstrapStandby

5. 启动 NameNode + ZKFC

hdfs --daemon start namenode
hdfs --daemon start zkfc

6. 启动 DataNode

hdfs --daemon start datanode

六、验证 HA

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

手动测试:

hdfs haadmin -failover nn1 nn2

七、常见问题

  • ❌ NameNode 无法切换 → 检查 ZKFC 是否启动
  • ❌ JournalNode 不一致 → 删除 /data/journalnode 重新初始化
  • ❌ SSH 隔离失败 → 确认 ssh nn2 免密可用

如果你需要 CentOS + Hadoop 3.x 具体版本 YAML/脚本 或 非 QJM(NFS)方式,可以继续问我。

0 踩