前提,运维说公司机房网络遭遇施工,出现半小时网络中断
服务受影响,当网络恢复后,发现服务还不能恢复,查看日志有报hbase的一些异常,具体如下:
org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: Region userinfo,,1500870428653.9e153748297702a1328d41aeef7fc39b. is not online on tw06292,16020,1507705880785 o.a.hadoop.hbase.client.AsyncProcess : #42090621, waiting for some tasks to finish. Expected max=0, tasksInProgress=24
刚开始是认为是服务中断,hbase在做数据的矫正以及有些任务在处理,在这种情况下,hbase是不可用的,导致服务端设计hbase操作的接口都不能使用,服务器一直处于崩溃状态,通过hbase的web url检查发现,hbase集群的3个region server,只有一个regionServer中region的个数正常,其他两个regionserver 的region都是个位数,明显有region丢失情况,当时想不会数据丢失吧,后来想着把有问题的regionserver重启一下看看能不能恢复,重启之后region本来是各位数,直接变成0了,心想,不会这下数据全部丢了吧,那个着急的,后来查了一下资料,说数据丢失能够修复,查到这个命令;
hbase hbck -fix
就开始修复数据了,看着修复日志挺正常的,觉得有戏,整得意忘形呢,突然修复结束,提示有59个region损坏没法修复,懵逼了,具体日志如下
Exception in thread "main" java.io.IOException: 59 region(s) could not be checked or repaired. See logs for detail
当时查询的解决方案还有个方案二是:
base-site.xml
配置文件里面增加如下配置:
下面的网上查找的资料片段,在此记录一下
3.1 【解决方案一】
最终在google上找到以下资料,跟我们出现的情况类似:
hbase-error-there-is-a-hole-in-the-region-chain
hbase-hbck-cant-fix-region-inconsistencies
照着链接上面的思路进行如下步骤:
1 ) 停掉hbase集群
2)删除hbase在hdfs目录下所有表目录下的recovered.edits
eg :
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3)重启hbase集群,所有的region就都online了
注意,这种通过删除recovered.edits的方式来恢复集群,会丢失部分数据。
3.2【解决方案二】
在Google上面有人遇到了在使用phoenix本地索引的时候重启HBase集群后出现了跟我们类似的情况:
Can-phoenix-local-indexes-create-a-deadlock-after-an-HBase-full-restart
根据上面的思路,我们需要在集群所有RegionServer的hbase-site.xml
配置文件里面增加如下配置:
- 1
- 2
然后重启HBase集群就可以了。