Ubuntu环境下HDFS高可用(HA)配置步骤
core-site.xml在所有节点的$HADOOP_HOME/etc/hadoop/core-site.xml中添加以下配置,指定默认文件系统和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>
hdfs-site.xml在所有节点的$HADOOP_HOME/etc/hadoop/hdfs-site.xml中添加以下配置,定义HA相关参数:
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> <!-- 与core-site.xml中的fs.defaultFS一致 -->
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value> <!-- NameNode标识,自定义(如nn1、nn2) -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>nn1_host:8020</value> <!-- Active NameNode的RPC地址 -->
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>nn2_host:8020</value> <!-- Standby NameNode的RPC地址 -->
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>nn1_host:50070</value> <!-- Active NameNode的HTTP地址 -->
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>nn2_host:50070</value> <!-- Standby NameNode的HTTP地址 -->
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value> <!-- JournalNode共享编辑日志地址 -->
</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> <!-- 防脑裂机制:通过SSH杀死Standby进程 -->
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value> <!-- SSH私钥路径(需提前配置无密码登录) -->
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/journalnode/data</value> <!-- JournalNode本地数据目录 -->
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value> <!-- 启用自动故障转移 -->
</property>
</configuration>
若未单独配置ZooKeeper集群,可在所有ZooKeeper节点的$ZOOKEEPER_HOME/conf/zoo.cfg中添加:
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
并在每个节点的dataDir目录下创建myid文件(内容为对应server ID,如zk1节点写1)。
在所有JournalNode节点上执行以下命令,启动JournalNode服务:
hdfs --daemon start journalnode
使用jps命令检查是否出现JournalNode进程,确认服务正常运行。
在**其中一个NameNode(如nn1)**上执行以下命令,初始化共享编辑日志:
hdfs namenode -initializeSharedEdits
此命令会将本地NameNode的编辑日志同步到JournalNode集群。
hdfs namenode -format
此操作会创建HDFS的元数据目录(如/var/hadoop/dfs/name),仅需执行一次。start-dfs.sh
此时nn1会成为Active NameNode,nn2为Standby NameNode。在所有ZooKeeper节点上执行以下命令,启动ZooKeeper服务:
zkServer.sh start
使用zkServer.sh status检查状态,确保有1个Leader和2个Follower。
使用hdfs haadmin命令查看NameNode状态,确认Active/Standby状态:
hdfs haadmin -getServiceState nn1 # 应返回"active"
hdfs haadmin -getServiceState nn2 # 应返回"standby"
kill -9 $(jps | grep NameNode | awk '{print $1}')
hdfs haadmin -getServiceState nn2 # 应返回"active"
dfs.namenode.name.dir(元数据目录)必须一致;dfs.ha.fencing.methods需配置有效的防脑裂机制(如sshfence),避免脑裂问题;dfs.ha.automatic-failover.enabled默认为true)。