下面以 CentOS 7/8 为例,说明如何配置 HDFS High Availability(HA)。这里采用 官方推荐的 QJM(Quorum Journal Manager)方式,不依赖 NFS。
| 主机名 | 角色 |
|---|---|
| nn1 | NameNode(Active) |
| nn2 | NameNode(Standby) |
| jn1 | JournalNode |
| jn2 | JournalNode |
| jn3 | JournalNode |
| dn1~dnN | DataNode |
所有节点需:
- CentOS 7/8
- JDK 8+
- 主机名可解析(/etc/hosts 或 DNS)
- 时间同步(NTP)
所有节点:
tar -zxvf hadoop-3.x.tar.gz -C /opt
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
NameNode 之间、NameNode 到 DataNode:
ssh-keygen
ssh-copy-id nn2
ssh-copy-id dn1
以下文件都在 $HADOOP_HOME/etc/hadoop/
core-site.xml<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
</configuration>
hdfs-site.xml<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/hadoop/journal</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>
workersdn1
dn2
dn3
zkServer.sh start
hadoop-env.shexport HADOOP_ZKFC_OPTS="-Dzookeeper.sasl.client=false"
在 jn1/jn2/jn3:
hdfs --daemon start journalnode
在 nn1:
hdfs namenode -format
hdfs zkfc -formatZK
在 nn2:
hdfs namenode -bootstrapStandby
在 nn1:
start-dfs.sh
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
访问:
hdfs haadmin -failover nn1 nn2
如果你需要:
可以告诉我你的集群规模和版本。