假期回来,梦翔儿发现实验室hadoop启动不起来了,查了一下,namenode节点挂了,启动不起来,有一些data节点挂了,其它节点磁盘(包括namenode的)看起来是满了。df -h 显示100%
namenode空间删除一些后,还是启动不起来
hadoop启动不了,也做不了平衡
我用的是cloudera hadoop 0.20.2 标准版
namenode的日志是:
2012-02-08 01:36:41,181 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:431)
at java.lang.Long.parseLong(Long.java:468)
at org.apache.hadoop.hdfs.server.namenode.FSEditLog.readLong(FSEditLog.java:1470)
at org.apache.hadoop.hdfs.server.namenode.FSEditLog.loadFSEdits(FSEditLog.java:796)
at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSEdits(FSImage.java:1039)
at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:845)
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:379)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:99)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:347)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:321)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:267)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:461)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1208)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1217)
2012-02-08 01:36:41,182 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
启动datanode的日志是:
2012-02-08 01:36:26,839 INFO org.apache.hadoop.security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
2012-02-08 01:36:27,920 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop22/192.168.2.22:8020. Already tried 0 time(s).
2012-02-08 01:36:28,920 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop22/192.168.2.22:8020. Already tried 1 time(s).
2012-02-08 01:36:29,921 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop22/192.168.2.22:8020. Already tried 2 time(s).
2012-02-08 01:36:30,921 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: hadoop22/192.168.2.22:8020. Already tried 3 time(s).
经过这段时间研究,发现并解决了该问题。分享经验如下:
1.之所有磁盘变慢,主要是因为放假,为了节能,关闭了一些datanode,结果hadoop的集群因datanode的关闭,而自动balance,从而使复本,都自动迁移到了live节点上,就导致live节点磁盘空间占满。从而挂掉。
2.因为没有单独设置secondnamenode,所以namenode的恢复就成为了问题
有网友说我的日志说明,namenode的image可能损坏了,应该用secondnamenode来恢复。
我看到了/var/lib/hadoop-0.20/cache/hdfs/dfs/name/current/previous.checkpoint
复制回去,发现也起不到还原的作用。
后来经了解,原来配置文档中的master设置并不是namenode的节点,而指的是secondnamenode,所以找到
有secondarynamenode运行,找到了这个目录:
/var/lib/hadoop-0.20/cache/hdfs/dfs/namesecondary
看到下面也有current 和 image
我尝试把这两个文件夹拷到dfs.name.dir
重启hadoop依旧有问题,难到namesecondary下也是损坏的?这不太可能吧?
3.后来技术群里的网友说,如果image大小正常的话,有可能是edit出问题了,查了一下,果然edit非常小,可能有问题。
4.所以解决问题方案就有两个,一个是把一个datanode改造成namenode,导入secondnamenode的数据;一个是把namenode格式化后,导入备份current数据。
后来和项目组伙伴们商量了一下,决定把namenode整体备份后,采用第二个方案,成功,具体操作如下:
1)用再生龙备份namenode节点数据,以防止出严重问题。将namenode的/var/lib/hadoop-0.20/cache/hdfs/dfs/name/current/目录拷贝到其它机子上备份,以备将来还原用。
2)格式化namenode节点:
sudo -u hdfs hadoop namenode -format
如果发现current文件夹无权限或锁定,就sudo rm -rf current这个文件夹,再格式化
3)将备份的current中的image文件拷回到新生成的current文件夹中
4)重新启动namenode节点或hadoop服务
5)重新启动所有datanode节点,如果datanode节点因磁盘满无法重启服务成功,就删除一些文件(比如说log或data缓存中的部分文件夹)再重启hadoop服务试试。
6)进行hadoop集群数据负载均衡: /usr/lib/hadoop/bin/start-balancer.sh
问题解决。
更多hadoop相关技术资料,可以查看海云在线技术文档栏目:http://cloud.dlmu.edu.cn/cloudsite/