HBase file layout needs to be upgraded案例分析
[attach]361[/attach]今天在一个内网的测试环境平台,kafka的river插件状态非正常,然后同事只好重建kafka river,river的状态始终无法正常,没有办法,同事对服务还不是很熟悉,我只好帮忙看看了!
因为kafka 的river插件作为kafka消息数据的consumers角色,把消费掉的数据,通过Hbase转存储到hdfs中!
如下所示是river对hbase的配置:
从这可以看出river插件是需要hbase的,然后我执行创建river的命令,tail观看到hbase master的hbase-root-master-hbase1.log如下:hbase.rootdir hdfs://10.2.2.39:9000/hbase hbase.cluster.distributed true hbase.master 10.2.2.39:60000 hbase.zookeeper.quorum 10.2.2.56,10.2.2.94,10.2.2.225
2015-10-14 17:34:13,980 INFO [master:hbase1:60000] util.FSUtils: Waiting for dfs to exit safe mode...
从log中可以看出hbase在等待hdfs退出安全模式,为什么要等Hdfs退出安全模式呢?那下面就具体看看Hdfs的log中有什么线索,查看Hdfs的Namenode的hadoop-root-namenode-had1.log记录如下:2015-10-14 17:33:52,283 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:root (auth:SIMPLE) cause:org.apache.hadoop.hdfs.server.namenode.SafeModeException: Log not rolled. Name node is in safe mode.运行如下命令等待退出安全模式
bin/hadoop dfsadmin -safemode wait发现半分钟后没有反映,然后运行如下命令检查hdfs的健康状态
bin/hadoop fsck /发现有很多corrupt blocks,不过还好备份数大于1.此时,hdfs需要自动的把备份数增加到2,所以需要对数据进行写操作,必须退出安全模式,于是:
bin/hadoop dfsadmin -safemode leave关闭之后等待集群把数据备份好,达到2,耐心等待一段时间吧,看数据量的大小,达到2之后,运行:
bin/hadoop fsck -move
也可以尝试:执行健康检查,删除损坏掉的block。 bin/hdfs fsck / -delete 注意: 这种方式会出现数据丢失,损坏的block会被删掉.把那些破坏的块移到/lost+found这个目录下面,启动Hbase,发现Hmaster启动之后进程又消失了,查看日志:
2015-10-14 17:48:29,476 FATAL [master:hbase1:60000] master.HMaster: Unhandled exception. Starting shutdown. org.apache.hadoop.hbase.util.FileSystemVersionException: HBase file layout needs to be upgraded. You have version null and I want version 8. Consult http://hbase.apache.org/book.html for further information about upgrading HBase. Is your hbase.rootdir valid? If so, you may need to run 'hbase hbck -fixVersionFile'. at org.apache.hadoop.hbase.util.FSUtils.checkVersion(FSUtils.java:600) at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:462) at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:153) at org.apache.hadoop.hbase.master.MasterFileSystem.从什么log中可以发现可能是hbase.version文件消失了!我看很多网友的做法是先把/hbase清理调,然后重启就好了,但是以前的数据就丢失了,这有点不科学。于是我:(MasterFileSystem.java:129) at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:800) at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:605) at java.lang.Thread.run(Thread.java:744)
bin/hadoop fs -ls /hbase发现/hbase/hbase.version确实已经消失了,这才恍然大悟,原来是之前的这个文件可能被损坏了,去/lost+found目录找确实能找到,但是这个文件似乎出了问题,-ls它也看不到。于是想到一个办法,我做了以下操作:
bin/hadoop fs -mv /hbase /hbase.bk重启HBase,这时就生成了/hbase/hbase.version文件,然后:
bin/hadoop fs -cp /hbase/hbase.version /hbase.bk/ bin/hadoop fs -rmr /hbase bin/hadoop fs -mv /hbase.bk /hbase这样再次重启HBase,发现Hbase开始splitting hlogs,数据得以恢复。然后再重建river,状态可以正常了!