在一次hadoop的重启过程中,重启失效,只能杀掉hadoop的namenode进程。
再重启的时候,出现如下问题:
2012-05-18 15:17:35,313 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.NullPointerException at org.apache.hadoop.hdfs.server.namenode.FSDirectory.unprotectedSetTimes(FSDirectory.java:1356) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.unprotectedSetTimes(FSDirectory.java:1345) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.loadFSEdits(FSEditLog.java:774) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSEdits(FSImage.java:1009) at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:827) at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:365) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:97) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:379) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:353) at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:254) at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:434) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1153) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1162)
查看name/current
drwxr-xr-x 2 hadoop hadoop 4096 2012-05-18 16:30 . drwxr-xr-x 8 hadoop hadoop 4096 2012-05-23 09:45 .. -rw-r--r-- 1 hadoop hadoop 864517 2012-05-18 16:30 edits -rw-r--r-- 1 hadoop hadoop 20914385 2012-05-18 16:30 edits.new -rw-r--r-- 1 hadoop hadoop 13644512 2012-05-18 16:30 fsimage -rw-r--r-- 1 hadoop hadoop 8 2012-05-18 16:30 fstime -rw-r--r-- 1 hadoop hadoop 100 2012-05-18 16:30 VERSION
出现了一个edits.new文件。说明在重启hadoop的时候没有将edits的信息合并到fsimage中,造成namenode出错。
将/tmp/dfs/namesecondary/current
中的edits,fsimage,fstime,VERSION拷贝到name/current中。
这个实际是将secondarynamenode定时镜像的文件覆盖掉出错的name节点的数据。
重启hadoop。正常启动。
这种方式,需要保证secondarynamenode是正确运行的,配置正确,每隔1个小时备份一次。这样能尽量保证数据的恢复。