下面以 CentOS 7/8 + Hadoop HDFS HA(基于 QJM) 为例,说明配置步骤。假设你已有基本的 Hadoop 单机/伪分布式基础。
典型角色(以 3 台 CentOS 为例):
| 主机名 | 角色 |
|---|---|
| node1 | NameNode(active) |
| node2 | NameNode(standby) |
| node3 | JournalNode / DataNode |
| (可多台) | DataNode |
核心组件:
hostnamectl set-hostname node1
cat >> /etc/hosts <<EOF
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
EOF
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
ssh-keygen -t rsa
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
yum install java-1.8.0-openjdk -y
tar -zxvf zookeeper-3.7.1.tar.gz -C /opt
conf/zoo.cfg
tickTime=2000
dataDir=/data/zookeeper
clientPort=2181
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
每台创建 myid:
echo 1 > /data/zookeeper/myid # node1
echo 2 > /data/zookeeper/myid # node2
echo 3 > /data/zookeeper/myid # node3
启动:
zkServer.sh start
$HADOOP_HOME/etc/hadoop/
<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>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<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>
<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>
node1
node2
node3
所有节点:
hdfs --daemon start journalnode
在 node1:
hdfs namenode -format
hdfs zkfc -formatZK
node1:
hdfs --daemon start namenode
node2(standby):
hdfs namenode -bootstrapStandby
hdfs --daemon start namenode
hdfs --daemon start zkfc
hdfs --daemon start datanode
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
杀掉 active NameNode 进程,观察是否自动切换。
如果你需要:
可以继续问我。