Hadoop在Linux中的高可用性配置指南
一、前置准备
在配置Hadoop高可用性(HA)前,需完成以下基础准备:
- 环境要求:至少3台Linux节点(用于NameNode、JournalNode、ResourceManager等角色),安装相同版本的Hadoop(建议2.7.2及以上)、JDK 1.8+;节点间网络互通,能通过主机名互相访问。
- 基础配置:
- 免密登录:在所有节点间配置SSH无密码登录(
ssh-keygen -t rsa生成密钥,cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys分发公钥)。 - 防火墙与SELinux:临时关闭防火墙(
systemctl stop firewalld)和SELinux(setenforce 0),避免端口被拦截。 - 主机名解析:在
/etc/hosts文件中添加所有节点的主机名与IP映射(如192.168.1.101 nn1、192.168.1.102 nn2)。
- 免密登录:在所有节点间配置SSH无密码登录(
- ZooKeeper集群:部署3个ZooKeeper节点(需奇数台,保证多数派机制),并启动服务(
zkServer.sh start)。
二、HDFS高可用性配置
HDFS HA的核心是通过JournalNode同步元数据和**自动故障转移(ZKFC)**实现NameNode的高可用。
1. 配置core-site.xml
在$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>
2. 配置hdfs-site.xml
在$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
在3个JournalNode节点上启动JournalNode服务(每个节点均需运行):
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
使用jps命令验证JournalNode进程是否启动(显示JournalNode进程即为成功)。
4. 格式化NameNode
在第一个NameNode节点(如nn1)上格式化NameNode(仅首次启动需执行):
hdfs namenode -format
5. 启动NameNode
- 在
nn1上启动第一个NameNode:$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode - 在
nn2上同步元数据并启动第二个NameNode:hdfs namenode -bootstrapStandby # 同步nn1的元数据 $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
6. 启动ZKFC(自动故障转移控制器)
在两个NameNode节点上启动ZKFC进程(用于监控NameNode状态并触发故障转移):
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
7. 验证HDFS HA
- 使用
hdfs haadmin命令查看NameNode状态:hdfs haadmin -getServiceState nn1 # 应显示"active" hdfs haadmin -getServiceState nn2 # 应显示"standby" - 访问Web UI(
http://nn1:50070、http://nn2:50070),确认NameNode状态正常。 - 模拟故障:停止
nn1的NameNode进程(hdfs-daemon.sh stop namenode),观察nn2是否自动切换为Active状态。
三、YARN高可用性配置
YARN HA的核心是通过ZooKeeper实现ResourceManager的主备切换。
1. 配置yarn-site.xml
在$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>
2. 启动ResourceManager
在两个ResourceManager节点上启动ResourceManager进程:
$HADOOP_HOME/sbin/start-yarn.sh
使用jps命令验证ResourceManager进程是否启动(显示ResourceManager进程即为成功)。
3. 验证YARN HA
- 访问ResourceManager Web UI(
http://rm1:8088、http://rm2:8088),确认ResourceManager状态正常。 - 模拟故障:停止
rm1的ResourceManager进程(yarn-daemon.sh stop resourcemanager),观察rm2是否自动切换为Active状态。
四、测试故障转移
- HDFS故障转移:
- 停止
nn1的NameNode进程,等待1-2分钟,nn2应自动切换为Active状态。 - 再次启动
nn1,其应自动切换为Standby状态。
- 停止
- YARN故障转移:
- 停止
rm1的ResourceManager进程,rm2应自动切换为Active状态。 - 再次启动
rm1,其应自动切换为Standby状态。
- 停止
通过以上步骤,Hadoop集群即可实现HDFS和YARN的高可用性,确保在节点故障时服务不中断。