1、问题描述:
hbase集群搭建后,曾经读取hbase数据接口一直很稳定,突然有一天读取hbase数据的接口服务,12-18小时就出现outoffmemory,导致tomcat宕机,用dump memory 查看堆栈发现在读取某个表时异常,最初以为是内存问题,尝试修改tomcat jvm,依然不解决问题,查看了各种原因以及百度,解决方案各种各样,但是都没有解决我的问题,最后怀疑是hbase表的问题,尝试使用hbase hbck修复,最终问题得以解决
2、修复步骤
步骤1. hbase hbck 检查输出所以ERROR信息,每个ERROR都会说明错误信息。
6 inconsistencies detected
步骤2. hbase hbck -fixTableOrphones 先修复tableinfo缺失问题,根据内存cache或者hdfs table 目录结构,重新生成tableinfo文件。
步骤3. hbase hbck -fixHdfsOrphones 修复regioninfo缺失问题,根据region目录下的hfile重新生成regioninfo文件
步骤4. hbase hbck -fixHdfsOverlaps 修复region重叠问题,merge重叠的region为一个region目录,并从新生成一个regioninfo
步骤5. hbase hbck -fixHdfsHoles 修复region缺失,利用缺失的rowkey范围边界,生成新的region目录以及regioninfo填补这个空洞。
步骤6. hbase hbck -fixMeta 修复meta表信息,利用regioninfo信息,重新生成对应meta row填写到meta表中,并为其填写默认的分配regionserver
步骤7. hbase hbck -fixAssignment 把这些offline的region触发上线,当region开始重新open 上线的时候,会被重新分配到真实的RegionServer上 , 并更新meta表上对应的行信息。
注意:一般fix命令执行的时间与你的集群存储大小和region个数相关,请耐心等待。不要kill掉正在执行的fix命令,以免引发其他问题。
修复某个表需要在 hbase shell 客户端先 disable 表名
修复后 enable 表名