HBase meta表数据修复


目的


为了弄清楚hbase:meta表中的数据(每个表的region所在的regionserver信息)是否会在集群每次重启后重新生成。


过程


将hbase:meta表中数据全部删除后重启集群,结果发现只有hbase:namespace的信息会重新生成并插入到hbase:meta表中,而其他所有用户表(用户自己创建的表)的信息都没有恢复。

这里又牵扯到另一个问题,如何修复hbase:meta表中的数据,用户表的数据是完整的,存储在hdfs上的数据也没有损坏,但是hbase:meta表中没有存储表的region信息,导致用户表无法访问。hbase提供了一个命令来修复hbase:meta表的数据,这个命令会读取hdfs中每个表对应的.regioninfo文件的内容并重新写入到hbase:meta表中

$ hbase hbck -fixMeta // Try to fix meta problems.  This assumes HDFS region info is good.
  • 1

执行这条命令后hbase:meta表中会插入每张表对应的region信息

test,,1437751474993.80af563e6 column=info:regioninfo, timestamp=1438252485548, value={ENCODED => 80af563e6a9d557b7274
 a9d557b7274a20d6a5d1260.      a20d6a5d1260, NAME => 'test,,1437751474993.80af563e6a9d557b7274a20d6a5d1260.', STARTKEY
                                => '', ENDKEY => ''} 
  • 1
  • 2
  • 3

但是这时候用户表还是无法查询,因为每张用户表的每个region在hbase:meta表中都会存储4列值:info:regioninfo、info:seqnumDuringOpen、info:server、info:serverstartcode,其中info:server这列值标记着该region所在的regionserver节点的位置信息。单独重启了集群的regionserver节点,发现hbase:meta表中的数据并没有增加,重启整个集群后hbase:meta表中数据变的完整了,即每张用户表的每个region在hbase:meta表中都会存储4列值,如下:

test,,1437751474993.80af563e6 column=info:regioninfo, timestamp=1438252485548, value={ENCODED => 80af563e6a9d557b7274
 a9d557b7274a20d6a5d1260.      a20d6a5d1260, NAME => 'test,,1437751474993.80af563e6a9d557b7274a20d6a5d1260.', STARTKEY
                                => '', ENDKEY => ''}                                                                  
 test,,1437751474993.80af563e6 column=info:seqnumDuringOpen, timestamp=1438253579793, value=\x00\x00\x00\x00\x00\x00\x
 a9d557b7274a20d6a5d1260.      00\x0A                                                                                 
 test,,1437751474993.80af563e6 column=info:server, timestamp=1438253579793, value=hadoop-pseudo.com.cn:60020          
 a9d557b7274a20d6a5d1260.                                                                                             
 test,,1437751474993.80af563e6 column=info:serverstartcode, timestamp=1438253579793, value=1438253573258              
 a9d557b7274a20d6a5d1260.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里写图片描述

再次重启HBase集群中发现info:seqnumDuringOpen、info:server、info:serverstartcode这三列值的timestamp值都有所改变,都插入了新版本的数据。


结论


hbase:meta表的每个region对应的4列值,在集群重启的时候info:seqnumDuringOpen、info:server、info:serverstartcode值会进行更新,而info:regioninfo不会进行更新。


附:HBase启动时region的分配过程

http://hbase.apache.org/book.html#regions.arch.assignment


When HBase starts regions are assigned as follows (short version):

  • The Master invokes the AssignmentManager upon startup.

  • The AssignmentManager looks at the existing region assignments in hbase:meta.

  • If the region assignment is still valid (i.e., if the RegionServer is still online) then the assignment is kept.

  • If the assignment is invalid, then the LoadBalancerFactory is invoked to assign the region. The load balancer (StochasticLoadBalancer by default in HBase 1.0) assign the region to a RegionServer.

  • hbase:meta is updated with the RegionServer assignment (if needed) and the RegionServer start codes (start time of the RegionServer process) upon region opening by the RegionServer.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值