在配置Hadoop高可用性(HA)前,需完成以下基础准备:
ssh-keygen -t rsa生成密钥,cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys分发公钥)。systemctl stop firewalld)和SELinux(setenforce 0),避免端口被拦截。/etc/hosts文件中添加所有节点的主机名与IP映射(如192.168.1.101 nn1、192.168.1.102 nn2)。zkServer.sh start)。HDFS HA的核心是通过JournalNode同步元数据和**自动故障转移(ZKFC)**实现NameNode的高可用。
在$HADOOP_CONF_DIR/core-site.xml中添加以下配置,指定HDFS的默认文件系统和ZooKeeper地址:
<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> <!-- ZooKeeper集群地址 -->
</property>
</configuration>
在$HADOOP_CONF_DIR/hdfs-site.xml中添加以下配置,定义NameNode、JournalNode和故障转移机制:
<configuration>
<!-- 定义逻辑集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 映射逻辑集群到NameNode节点(nn1、nn2为逻辑名称) -->
<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>
<!-- 指定每个NameNode的HTTP地址(Web UI) -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>nn1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>nn2:50070</value>
</property>
<!-- JournalNode同步目录(元数据持久化) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journal1:8485;journal2:8485;journal3:8485/mycluster</value>
</property>
<!-- JournalNode本地数据目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop-3.3.2/data/journal</value>
</property>
<!-- 客户端故障转移代理(自动选择Active NameNode) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 自动故障转移(依赖ZooKeeper) -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 故障转移隔离机制(SSH方式) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value> <!-- SSH私钥路径 -->
</property>
</configuration>
在3个JournalNode节点上启动JournalNode服务(每个节点均需运行):
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
使用jps命令验证JournalNode进程是否启动(显示JournalNode进程即为成功)。
在第一个NameNode节点(如nn1)上格式化NameNode(仅首次启动需执行):
hdfs namenode -format
nn1上启动第一个NameNode:$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
nn2上同步元数据并启动第二个NameNode:hdfs namenode -bootstrapStandby # 同步nn1的元数据
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
在两个NameNode节点上启动ZKFC进程(用于监控NameNode状态并触发故障转移):
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
hdfs haadmin命令查看NameNode状态:hdfs haadmin -getServiceState nn1 # 应显示"active"
hdfs haadmin -getServiceState nn2 # 应显示"standby"
http://nn1:50070、http://nn2:50070),确认NameNode状态正常。nn1的NameNode进程(hdfs-daemon.sh stop namenode),观察nn2是否自动切换为Active状态。YARN HA的核心是通过ZooKeeper实现ResourceManager的主备切换。
在$HADOOP_CONF_DIR/yarn-site.xml中添加以下配置,定义ResourceManager的HA逻辑:
<configuration>
<!-- 启用ResourceManager HA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 定义逻辑集群ID -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster</value>
</property>
<!-- 定义ResourceManager节点(rm1、rm2为逻辑名称) -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定每个ResourceManager的hostname -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>rm1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>rm2</value>
</property>
<!-- ZooKeeper集群地址(用于ResourceManager状态同步) -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zk1:2181,zk2:2181,zk3:2181</value>
</property>
<!-- 故障转移超时时间(毫秒) -->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
在两个ResourceManager节点上启动ResourceManager进程:
$HADOOP_HOME/sbin/start-yarn.sh
使用jps命令验证ResourceManager进程是否启动(显示ResourceManager进程即为成功)。
http://rm1:8088、http://rm2:8088),确认ResourceManager状态正常。rm1的ResourceManager进程(yarn-daemon.sh stop resourcemanager),观察rm2是否自动切换为Active状态。nn1的NameNode进程,等待1-2分钟,nn2应自动切换为Active状态。nn1,其应自动切换为Standby状态。rm1的ResourceManager进程,rm2应自动切换为Active状态。rm1,其应自动切换为Standby状态。通过以上步骤,Hadoop集群即可实现HDFS和YARN的高可用性,确保在节点故障时服务不中断。