软件版本:
hadoop2.7.3
hbase1.2.5
zookeeper3.4.6
1.问题描述:
生产HBase集群由于批量导入20亿数据之后,集群上产生了很多的region,各个Regionserver上的region负载已经达到了1200,很多数据表的region已经不在线,在手动执行major compact之前没有用hbase hbck命令进行集群状态检查和修复,直接执行大合并脚本进行了region的合并,等执行完大合并之后再去执行hbase hbck的时,输出以下报错信息:
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
2.问题分析
产生这种问题可能有以下两种情况:
1).整个集群由于region负载过高,数据表的部分region由于某些原因没有上线,通过hbase hbck 相关的修复命令进行了修复,再次重启后region原来的region又可以重新上线,导致两个region重叠(个人觉得这种可能性比较小)。
2).整个集群由于region负载过高,数据表的部分region由于某些原因没有上线,我没有进行hbase hbck健康检查,直接运行了脚本进行了大合并,导致某些Region在合并过程中,生成了新的region,而原来的两个region没有删除成功,导致有些region的startkey或者endkey重叠的现象。
下面我从生产环境的截图,为了方便理解,我对图中的Region进行了简单的标注,可以看出两个region2、region3的endkey都有c4,而region2的startkey和region1是连续的,region3的startkey与region1是不连续的,这里说明region3应该是合并之前应该删除而未删除的信息,存在冗余。
3解决方案:
1).需要删除region3在hbase:meta对应的数据,在hbase:meta表中,rowkey对应的就是region的ENCODED_REGIONNAME名称,先查看下:
由图可知,meta表中有该region有6列,直接使用delete删除,该rowkey对应的6列数据即可,删除命令:
delete 'hbase:meta','region名称','列名称'
2).删除meta表中的元数据后,还需要从hdfs上删除,该有问题的region对应的hdfs目录,如不删除,重启hbase,通过hbase hbck -fixMeta等命令生成元数据时,会重新生成,删除命令。
hadoop fs -rm -r -f /apps/hbase/data/data/命名空间/表名/region名
3).为了保险起见,我这里还删除了HBase在zookeeper上的znode缓存数据,让他下次重启重新生成。
4).重启hbase,可通过界面查看该表已经不存在重叠的region,使用hbase hbck查看hbase的状态,状态为OK,问题解决。