温馨提示×

centos怎样部署hdfs高可用

小樊
40
2026-10-06 09:19:46
栏目: 智能运维

下面以 CentOS 7/8 为例,系统性地说明 HDFS HA(High Availability) 的部署思路与关键步骤。HDFS HA 一般基于 NameNode HA + JournalNode + ZKFC + ZooKeeper。


一、HDFS HA 架构说明

核心组件:

  • NameNode(Active / Standby):2 个,避免单点故障
  • JournalNode(JN):至少 3 个,存放 editlog
  • ZKFC(ZK Failover Controller):控制 NameNode 切换
  • ZooKeeper(ZK):至少 3 个节点,选主与协调

二、环境准备

1. 主机规划(示例)

主机名 IP 角色
nn1 192.168.1.11 NameNode(Active)
nn2 192.168.1.12 NameNode(Standby)
jn1 192.168.1.21 JournalNode + ZK
jn2 192.168.1.22 JournalNode + ZK
jn3 192.168.1.23 JournalNode + ZK
dn1~dnN 192.168.1.3x DataNode

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

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

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

# 主机名与 hosts
vi /etc/hosts

3. 安装 JDK

yum install -y java-1.8.0-openjdk-devel
java -version

4. 配置 SSH 免密(NameNode 之间)

ssh-keygen
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
mv /opt/apache-zookeeper-3.7.1-bin /opt/zookeeper

配置:

vi /opt/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
server.1=jn1:2888:3888
server.2=jn2:2888:3888
server.3=jn3:2888:3888

创建 myid:

echo 1 > /data/zookeeper/myid  # jn1

启动:

/opt/zookeeper/bin/zkServer.sh start

四、部署 Hadoop(HDFS HA)

1. 安装 Hadoop

wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -zxvf hadoop-3.3.6.tar.gz -C /opt

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>

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

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

  <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.automatic-failover.enabled</name>
    <value>true</value>
  </property>
</configuration>

3. 配置 core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>

  <property>
    <name>ha.zookeeper.quorum</name>
    <value>jn1:2181,jn2:2181,jn3:2181</value>
  </property>
</configuration>

4. 配置 workers(DataNode)

vi /opt/hadoop/etc/hadoop/workers
dn1
dn2
dn3

五、启动 HDFS HA

1. 启动 JournalNode

hdfs --daemon start journalnode

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

hdfs namenode -format

3. 初始化 HA 状态到 ZK

hdfs zkfc -formatZK

4. 启动 NameNode

hdfs --daemon start namenode

5. 同步 Standby NameNode

hdfs namenode -bootstrapStandby

6. 启动 ZKFC

hdfs --daemon start zkfc

7. 启动 DataNode

hdfs --daemon start datanode

六、验证 HA

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

杀死 Active NN:

kill -9 <nn_pid>

观察 Standby 是否自动切换为 Active。


七、常见问题

  • 脑裂:确保 dfs.ha.fencing.methods 配置正确
  • JN 数量不足:至少 3 个
  • ZK 未启动:HA 无法切换
  • SSH 不通:ZKFC 无法 fence

如果你需要:

  • 一键部署脚本
  • 基于 Docker / K8s
  • HDFS + YARN HA
  • 生产参数优化

可以继续告诉我你的使用场景。

0 踩