下面以 CentOS 7/8 为例,系统性地说明 HDFS HA(High Availability) 的部署思路与关键步骤。HDFS HA 一般基于 NameNode HA + JournalNode + ZKFC + ZooKeeper。
核心组件:
| 主机名 | 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 |
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 主机名与 hosts
vi /etc/hosts
yum install -y java-1.8.0-openjdk-devel
java -version
ssh-keygen
ssh-copy-id nn1
ssh-copy-id nn2
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
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
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>
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>
vi /opt/hadoop/etc/hadoop/workers
dn1
dn2
dn3
hdfs --daemon start journalnode
hdfs namenode -format
hdfs zkfc -formatZK
hdfs --daemon start namenode
hdfs namenode -bootstrapStandby
hdfs --daemon start zkfc
hdfs --daemon start datanode
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
杀死 Active NN:
kill -9 <nn_pid>
观察 Standby 是否自动切换为 Active。
dfs.ha.fencing.methods 配置正确如果你需要:
可以继续告诉我你的使用场景。