我通过java客户端将数据插入Hbase。但是,突然间Region服务器崩溃了。所以我重新启动了Hbase,之后Hmaster没有运行。当我运行修复工具 - hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair
时,我得到以下原因: -
ERROR: (region TABLE_NAME, rowkey_value, region_name_1) Multiple regions have the same start key: rowkey_value
ERROR: (region TABLE_NAME, rowkey_value, region_name_2) Multiple regions have the same start key: rowkey_value
ERROR: (regions Table_Name, rowkey_value, region_name_1 and Table_Name, rowkey_value, region_name_2) There is an overlap in the region chain.
ERROR: Found inconsistency in table TABLE_NAME
我不能运行hbck(在线修复/修复),因为我的Hmaster没有运行。我现在需要手动修复它。现在有大量数据,所以我不想丢失它们。
编辑:
我格式化了namenode并再次添加数据瞧,同样的问题再次!!这一次,我让Hmaster跑了。所以我执行了hbck -fixHdfsOverlaps
命令,但很长一段时间后,我发现现在,Hmaster和Namenode都没有运行。现在,由于NN也已关闭,我无法访问HDFS。我不想丢失任何数据。我注意到其中一个区域在其区域的“.tmp”目录中有大量数据,还有待进行压缩。那么,如何重新恢复HDFS和hbase呢?
NameNode的日志信息:
2014-07-09 09:19:44,498 ERROR org.apache.hadoop.hdfs.server.namenode.FSNamesystem: FSNamesystem initialization failed.
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /data/hdfstmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:288)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:97)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:386)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:360)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:276)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:496)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1279)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288)
2014-07-09 09:19:44,500 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /data/hdfstmp/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.
at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:288)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.loadFSImage(FSDirectory.java:97)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.initialize(FSNamesystem.java:386)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:360)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:276)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:496)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1279)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1288)
2014-07-09 09:19:44,501 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ip-10-237-184-7.ec2.internal/10.237.184.7
************************************************************/
然后hdfs temp目录只包含dfs和mapred目录。名称目录丢失。名称dir中的图像和previous.checkpoint,edits等也是如此。现在,这是否意味着数据丢失了?还是无法恢复?有没有办法可以备份数据?
编辑(2):我看到运行hbck -fixHdfsOverlaps
命令后数据目录为空。或者hbck命令在运行恢复时是否临时将数据移动到其他位置?如果是这样,它是什么以及它如何被带回并再次恢复HDFS而没有任何或最小的数据丢失。
我们曾经多次遇到过这个问题并编写了基于java的程序来解决它。它依赖于合并以相同键开头的两个区域。合并区域必须妥善保管。幸运的是,具有相同密钥的多个区域共享一个独特的特征,只有一个区域具有以相同密钥开始的所有区域中的数据。因此合并操作变得便宜并且数据丢失和合并失败的可能性最小化。实用程序可用https://github.com/nabhosal/HBaseRecoveryTools