You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hadoop 2.7.2集群能否添加Standby Namenode实现高可用且保留元数据?

答:可以在保留现有元数据的前提下为Hadoop 2.7.2集群添加Standby Namenode实现高可用

完全可以!Hadoop 2.x版本原生支持基于Quorum Journal Manager(QJM)的高可用架构,而且不需要删除现有Namenode的元数据就能完成改造。下面是一步步的实操指南:

一、前置准备

  • 准备至少1个额外节点作为Standby Namenode(如果资源紧张,也可以和其他服务共存,但建议单独部署以保证可用性)
  • 部署3个JournalNode节点(推荐用现有Datanode节点或新节点,必须是奇数个,保证Quorum机制生效)
  • 提前部署好ZooKeeper集群(用于自动故障转移,ZKFC依赖它)
  • 确保所有节点间已经配置好SSH免密登录(包括Active NN和Standby NN之间,以及ZKFC节点到NN节点)

二、修改核心配置文件

所有配置修改需要同步到集群所有节点的$HADOOP_HOME/etc/hadoop目录下

1. 修改core-site.xml

添加或修改以下配置:

<!-- 指定nameservice名称,比如mycluster -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<!-- ZooKeeper集群地址 -->
<property>
  <name>ha.zookeeper.quorum</name>
  <value>zk-node1:2181,zk-node2:2181,zk-node3:2181</value>
</property>

2. 修改hdfs-site.xml

添加或修改以下关键配置:

<!-- 启用nameservice -->
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<!-- 指定当前nameservice下的两个Namenode ID -->
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
<!-- nn1的RPC地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>active-nn-host:8020</value>
</property>
<!-- nn1的HTTP地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>active-nn-host:50070</value>
</property>
<!-- nn2的RPC地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>standby-nn-host:8020</value>
</property>
<!-- nn2的HTTP地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>standby-nn-host:50070</value>
</property>
<!-- 指定共享edits存储的JournalNode地址 -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://jn-node1:8485;jn-node2:8485;jn-node3:8485/mycluster</value>
</property>
<!-- 配置客户端故障转移代理 -->
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置故障隔离方法(这里用SSH免密杀掉进程) -->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
<!-- 指定SSH免密登录的密钥路径 -->
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 启用自动故障转移 -->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>
<!-- 禁用Secondary Namenode,因为Standby NN会承担其checkpoint功能 -->
<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>0</value>
</property>

三、初始化JournalNode集群

在每个JournalNode节点上执行以下命令启动服务:

hadoop-daemon.sh start journalnode

然后在Active Namenode节点上执行命令,将现有edits数据同步到JournalNode集群:

hdfs namenode -initializeSharedEdits

四、同步Standby Namenode元数据

在Standby Namenode节点上执行以下命令,自动从Active NN同步fsimage和edits数据(完全保留现有元数据):

hdfs namenode -bootstrapStandby

五、初始化ZooKeeper故障转移控制器(ZKFC)

在Active Namenode节点上执行命令,初始化ZKFC的状态:

hdfs zkfc -formatZK

六、启动HA集群服务

按以下顺序启动所有服务:

  1. 启动所有JournalNode节点(如果之前没启动的话)
  2. 启动Active Namenode:hadoop-daemon.sh start namenode
  3. 启动Standby Namenode:hadoop-daemon.sh start namenode
  4. 启动两个NN节点上的ZKFC:hadoop-daemon.sh start zkfc
  5. 重启所有Datanode节点:hadoop-daemon.sh restart datanode

七、验证HA功能

  • 查看两个Namenode的状态:
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

正常情况下一个显示active,另一个显示standby

  • 手动触发故障转移测试:
hdfs haadmin -failover nn1 nn2

再次查看状态,应该会切换角色

  • 模拟Active NN故障(杀掉进程),检查Standby NN是否自动切换为Active

注意事项

  • 原来的Secondary Namenode可以停止服务了,HA模式下Standby Namenode会自动完成checkpoint操作,无需再保留SNN
  • 确保JournalNode集群至少有一半以上节点存活,否则无法写入edits数据
  • 所有配置修改后一定要同步到所有节点,避免出现配置不一致问题

内容的提问来源于stack exchange,提问作者Dino L.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:39:55