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集群服务
按以下顺序启动所有服务:
- 启动所有JournalNode节点(如果之前没启动的话)
- 启动Active Namenode:
hadoop-daemon.sh start namenode - 启动Standby Namenode:
hadoop-daemon.sh start namenode - 启动两个NN节点上的ZKFC:
hadoop-daemon.sh start zkfc - 重启所有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.
相关产品推荐
相关产品推荐

