赞
踩
有一个hdfs高可用集群,因为某些操作,导致其中一个namenode的信息全部丢失了。最后只剩下一个完整的namenode信息和datanode信息。于是在在启动hdfs后发现独有的namenode始终处于standby状态。即使通过hdfs haadmin -transitionToActive命令也不能强制转换namenode为active。因此hdfs一直不能正常对外提供服务。
高可用hdfs集群,至少要有两个namenode节点,如果只有一个namenode节点,那么无论怎么启动,namenode节点状态始终为standby。所以如果想将hdfs重新恢复可用,那么可以重新搭建一个namenode节点。然后将完整的namenode元数据重新导入到新namenode中。
安装好jdk等基础环境
拷贝时要注意namenode和datanode的存储目录信息。如果namenode和datanode的存储路径就在安装文件夹内,那么拷贝到新节点时要注意删除datanode存储路径下的数据(不删也可以,只是新增的节点只能作为namenode使用,不能作为datanode使用)。
namenode和datanode的存储路径信息可以通过hdfs-site.xml配置文件中的dfs.namenode.name.dir、dfs.datanode.data.dir进行查看,如果没配置,那么可以通过core-site.xml中的hadoop.tmp.dir属性查看hdfs的临时目录在哪,namenode和datanode数据在没有主动声明存储位置时,会全存储到临时目录里。
这里主要更改两个配置:
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>node1:50070</value>
</property>
另外这里提一句,hdfs中除了配置namenode地址外,还有datanode、journalnode、zookeeper地址的配置,如果这些地址都和缺失的namenode节点有关,那么都需要进行更改。
这里主要通过 hdfs zkfc -formatZK 命令重新初始化zookeeper上原有的namenode记录。
hadoop-daemon.sh start journalnode
hadoop-daemon.sh start namenode
hadoop-daemon.sh start zkfc
hadoop-daemon.sh start datanode
因为生产环境不能截图,所以本文的介绍多以解决流程为主,虽然不同的场景可能修改的配置不一样,但是该类问题的解决流程大体如上所述。而且我在虚拟机中也验证过上述的流程的通用性。
上述解决方式其实是相当于是重新引入一个namenode节点信息,进而从新恢复为高可用状态。但是我在想如果有完整的namenode和datanode信息,可否从高可用状态降为单namenode状态继续使用,这样就不用引入新的namenode节点。后续我将验证这一猜想。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。