spark任务中入hbase任务全部失败了,查看日志发现hbase出现问题
报错日志:
  1. 在hbase的log中看到报错
    Call queue is full on xxxx,16000,1611197476326, too many items queued
    修改了配置文件,增加了队列数量
     <property>
         <name>hbase.regionserver.handler.count</name>
         <value>200</value>
      </property>
      <property>
          <name>hbase.regionserver.metahandler.count</name>
          <value>80</value>
      </property>

参数说明:https://hijiazz.gitee.io/hbase-callqueue-isfull/
2. 并且zookeeper好像挂掉了,后来重启zk。

然后重启hbase后出现了region不一致的情况。

尝试进行修复

1、前提:HDFS fsck 确保 hbase根录下文件没有损坏丢失,如果有,则先进行坏block 移除。

2、看webUI中lock页面是否有锁住的producer

先尝试bypass -or +pid ,将父producer解锁,再bypass -o将子producer解锁

3、 看webui中是否出现RIT卡在了OPENNING/CLOSING状态的region,使用assigns -o 进行重分配,生成新的producer

4、再次查看lock中是否出现新的,重复步骤2和3,直到RIT消失或lock中不再出现新的。

5、使用hbase hbck --details > hbck.log 来查看状态

如果日志中出现status=inconsistencies证明还存在region不一致,搜索ERROR(在vim命令模式输入/ERROR来搜索)查看信息,每个ERROR都有错误说明,根据说明进行修复。

7、RIT的几种情况:

7.1、 hdfs上region不存在但是元数据存在
  1. 对regionID进行assigns或extraRegionsInMeta --fix进行修复。
  2. 或者将region unassigns 下线,然后进入hbase shell将hbase:meta表中的多余元数据删除,执行deleteall 'hbase:meta',"regionName" ,需要注意regionname为全路径从表名开始,如果regionname中存在转义字符则使用双引号,不存在单引号双引号都可以。
7.2、hdfs上region存在但是元数据不存在
  1. 如果region是正常的region,而不是修复产生的,可以尝试重建元数据 addFsRegionsMissingInMeta
  2. 如果是修复产生的,那么此region里是没有真实数据信息的,或者此region是存在重叠的,那么需要删除hdfs上的region文件夹
7.3、 not deployed on any region server,region未分配

使用assigns命令分配此region

7.4、 region元数据在dn1但实际是在dn2上启动的

尝试unassign在assigns,直到RIT消失,这个具体解决办法未知,就是尝试上线下线

7.5、 hbase There is an overlap in the region chain 出现两个region重叠的问题

一般来说是修复别的问题产生的,我这边是这个原因,因为产生了一个新的region,所以讲新region删除即可,判断region新旧,就去看hdfs上region数据的日期,或者去元数据里看timestamp的日期,找到最新的删除即可,注意删除前先unassigns,然后删除元数据,在删除hdfs数据即可。

7.6、Multiple regions have the same startkey 出现key重叠

与7.5出现的原因是一致的,由修复所产生的,目测是因为assigns了一个在线的region,重新分配了两次导致产生了一个新region,处理步骤与7.5一致,先确定哪个是最新的region,然后unassigns此region,在删除元数据,删除hdfs数据即可。

5. 注意

实际上面的解决办法都不一定能解决,实际如何解决的有待商榷。

根据hbck2 -help 来查看帮助文档,看看其中的命令在什么情况下使用,然后就操作就行了。

最终解决的办法是hbase hbck后还存在5个region不一致,后来将他们在hdfs上删除了(会丢失数据),然后重新assign这些region,(这里可能会存在一定时间的延迟,多执行几次hbase hbck和assigns命令)最终hbase hbck后status=ok了,不一致的region特别多或者数据不可以删除能修复尽量去修复,总共修复了15/6个小时,还是在第二天将最后几个无法处理掉的region删除后集群才恢复正常的,本来是存在56个不一致的region的。

8、 如果出现数据空洞,There is a hole in the region chain between. You need to create a new .regioninfo and region dir in hdfs to plug the hole

三个解决办法

  1. 使用fixMeta命令来重建空洞和修复region重叠,(使用后没效果)
  2. 删除HDFS对应region下recovered.edits,注意此操作可能会丢失部分数据,先将出现空洞的左右两边的region执行unassigns下线操作,然后删除HDFS上的recovered.edits,然后将执行assigns将region上线,等待一会观察空洞是否消失,如果还存在,执行一下fixMeta,即可解决空洞。(我使用的这个,只出现了一两个region数据空洞,并且数据丢一点可以接受),网上博客说的删除所有表的尽量不要去操作,我这里只是删除了出现数据空洞的region下的recovered.edits
  3. 增加配置后重启集群:提高regionserver的线程数量,以此来提高rs处理region的能力(没测试)
<property>  
	<name>hbase.regionserver.executor.openregion.threads</name> 
 	<value>100</value> 
</property>

尽量阅读hbck2的help文档,理解一下里面命令的使用准则,在根据hbase hbck中的ERROR信息对应进行修复,里面的命令在解决的过程中基本都尝试过了,但是对其理解的还是不透,后续还要在研究一下,如果实在是尽力了也无法修复,那就删除它吧,目前只能修复到这种地步了,经过16个小时的尝试最后剩余了5个region只能删除了,然后问题就解决掉了,HBCK2修复元数据网上的资料实在是太少了,只能摸着石头过河,不断成长。

参考/引用博客:

官网文档:https://github.com/apache/hbase-operator-tools/tree/master/hbase-hbck2
队列参数修改:https://hijiazz.gitee.io/hbase-callqueue-isfull/
hbck2使用:https://www.modb.pro/db/54575
Hbase修复博客:https://cloud.tencent.com/developer/article/1359221 它里面的连接也可以一并看下

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐