前言
今天给客户远程维护分布式数据库系统。那边遇到的分布式数据库系统无法启动的问题,通过日志分析一步一步分析发现,在hadoop这块少了一个 NameNode 服务器启动不成功。
正文
进一步查看 namenode 日志,发现了如下错误:
FATAL org.apache.hadoop.hdfs.server.namenode.FSEditLog: Error: recoverUnfinalizedSegments failed for required journal (JournalAndStream(mgr=QJM to [IP:8485, IP:8485, IP:8485], stream=null)) java.io.IOException: Timed out waiting 120000ms for a quorum of nodes to respond. at org.apache.hadoop.hdfs.qjournal.client.AsyncLoggerSet.waitForWriteQuorum(AsyncLoggerSet.java:137) at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.createNewUniqueEpoch(QuorumJournalManager.java:183) at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.recoverUnfinalizedSegments(QuorumJournalManager.java:441) at org.apache.hadoop.hdfs.server.namenode.JournalSet$8.apply(JournalSet.java:624) at org.apache.hadoop.hdfs.server.namenode.JournalSet.mapJournalsAndReportErrors(JournalSet.java:393) at org.apache.hadoop.hdfs.server.namenode.JournalSet.recoverUnfinalizedSegments(JournalSet.java:621) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.recoverUnclosedStreams(FSEditLog.java:1478) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startActiveServices(FSNamesystem.java:1236) at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.startActiveServices(NameNode.java:1771) at org.apache.hadoop.hdfs.server.namenode.ha.ActiveState.enterState(ActiveState.java:61) at org.apache.hadoop.hdfs.server.namenode.ha.HAState.setStateInternal(HAState.java:64) at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.setState(StandbyState.java:49) at org.apache.hadoop.hdfs.server.namenode.NameNode.transitionToActive(NameNode.java:1644) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.transitionToActive(NameNodeRpcServer.java:1378) at org.apache.hadoop.ha.protocolPB.HAServiceProtocolServerSideTranslatorPB.transitionToActive(HAServiceProtocolServerSideTranslatorPB.java:107) at org.apache.hadoop.ha.proto.HAServiceProtocolProtos$HAServiceProtocolService$2.callBlockingMethod(HAServiceProtocolProtos.java:4460) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2220) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2216) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2214)
这个报错信息里提示 quorum 连接 timeout 了,开始以为是是 quorum 的问题,后来发现服务上的这个 quorum 服务是正常运行的,还好 hadoop 的生态比较好,被我发现可能是 journalnode 出问题导致的。
这个就比较坑,因为 jounralnode 服务状态是正常的。就不吐槽这个了。
进一步调差 journalnode 日志,终于发现问题了:
是 journalnode 的数据文件损坏了。
OK,修复步骤如下:
删除 journalnode 报错日志所在的服务器上的被损坏的数据文件,同时将其他没有报错的服务器上的数据文件复制过来。
cd $hadoop_home 备份即将要删除的文件 tar -zcvf journal.bak.tar.gz ./jndata cd $hadoop_home/jndata/mycluster/current (下面命令表示删除当前目录下的所有文件,小心核对下) rm -rf ./* ls 确认删除完之后 scp -r $user@$hostname:$hadoop_home/jndata/mycluster/current/* .
操作结束之后,hadoop 启动成功,分布式数据库启动成功。