Ubuntu环境下Hadoop高可用性(HA)配置指南
Hadoop高可用性(HA)通过主备NameNode、JournalNode、ZooKeeper等组件解决单点故障问题,确保集群在节点宕机时仍能提供服务。以下是Ubuntu系统下的详细配置步骤:
apt install openjdk-8-jdk),配置静态IP和主机名映射(/etc/hosts文件)。ssh-keygen -t rsa → ssh-copy-id user@nodeX),确保节点间可免密访问。zkServer.sh status)。core-site.xml设置HDFS的默认文件系统和ZooKeeper地址,所有节点均需配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> <!-- 集群逻辑名称,需与hdfs-site.xml一致 -->
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1:2181,zk2:2181,zk3:2181</value> <!-- ZooKeeper集群地址 -->
</property>
</configuration>
hdfs-site.xml定义NameNode HA、JournalNode共享存储等关键参数,所有节点均需配置:
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> <!-- 集群逻辑名称 -->
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value> <!-- NameNode ID列表 -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value> <!-- nn1的RPC地址 -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value> <!-- nn2的RPC地址 -->
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node3:8485;node4:8485;node1:8485/mycluster</value> <!-- JournalNode共享存储地址 -->
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value> <!-- 启用自动故障转移 -->
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1:2181,zk2:2181,zk3:2181</value> <!-- ZooKeeper集群地址 -->
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value> <!-- 隔离机制(防止脑裂) -->
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/user/.ssh/id_rsa</value> <!-- SSH私钥路径 -->
</property>
</configuration>
yarn-site.xml(ResourceManager HA)若需ResourceManager高可用,添加以下配置(所有节点均需配置):
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value> <!-- 启用RM HA -->
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value> <!-- ResourceManager ID列表 -->
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value> <!-- rm1的主机名 -->
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2</value> <!-- rm2的主机名 -->
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zk1:2181,zk2:2181,zk3:2181</value> <!-- ZooKeeper集群地址 -->
</property>
</configuration>
在$HADOOP_HOME/etc/hadoop/workers中添加所有DataNode和NodeManager节点(如node3\node4),用于启动DataNode和NodeManager服务。
JournalNode用于存储NameNode的编辑日志(edits),确保主备NameNode数据一致。在所有JournalNode节点(如node3~node4)上执行:
$HADOOP_HOME/sbin/hadoop-daemons.sh start journalnode
验证JournalNode是否启动(jps命令应显示JournalNode进程)。
在其中一台NameNode(如node1)上执行以下命令,将本地元数据同步到JournalNode:
hdfs namenode -bootstrapStandby
此命令会将nn1的元数据复制到JournalNode,为后续格式化做准备。
hdfs namenode -format
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
jps命令检查各节点进程(如nn1、nn2、rm1、rm2等是否运行)。hdfs haadmin -getServiceState nn1应返回active,hdfs haadmin -getServiceState nn2应返回standby)。http://node1:9870),确认集群状态。dfs.ha.fencing.methods需配置有效隔离方法(如sshfence),防止脑裂(两个NameNode同时为Active)。