disable table失败,运维人员该如何处理?

运维 系统运维
相信每一个维护hbase集群的运维人员一定碰到过disable失败,陷入无穷的"Region has been PENDING_CLOSE for too long..."状态,此时没有什么好的办法处理。经常需要重启集群。

    相信每一个维护hbase集群的运维人员一定碰到过disable失败,陷入无穷的"Region has been PENDING_CLOSE for too long..."状态,此时没有什么好的办法处理。经常需要重启集群。 
    这个问题产生的原因非常讨厌,经过一段时间的分析和验证,得到了根本原因。要理解它,必须从disable的原理说起: 

  1.   disable线程是一个DisableTableHandler类,我们看它的handleDisableTable()方法,在while循环中先获取table的regions列表,然后调用BulkDisabler的bulkAssign()方法,等待bulkAssign()返回为true时则结束
  2.   在bulkAssign()方法中启动线程池,然后等待线程池超时,超时时间由hbase.bulk.assignment.waiton.empty.rit控制
  3.   在每个线程中,先从regions collection中得到regions列表,然后通知rs来处理该region,并且把该region放入RIT列表中,表示该region正在进行处理
  4.   rs处理完region以后,将该region状态在zk上置为closing,此时master得到通知
  5.   master将这个region从RIT列表中删除,并从regions列表中删除。

     注意以上最后一步,当master把它从RIT中删除以后,还有短暂的时间这个region还在regions列表中,此时另一个线程拿到了这个region,并且此时这个region不处于RIT状态保护,于是另一个线程开始重复以上过程,而前一个线程己经把它从collection中删除了,于是后一个线程再也无法完成closing事件。直到RIT超时(默认30秒)。 

    于是有两个修改办法: 
     1、缩短hbase.bulk.assignment.waiton.empty.rit这个时间(默认10分钟,it's too long...),让它重新进行一轮disable,此时会先把RIT的region都处理掉再继续,这样多几次尝试总会成功的。 
     2、修改代码:(https://issues.apache.org/jira/secure/attachment/12487669/HBASE-4064_branch90V2.patch) 

     Java代码 : 
  1. Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java    
  2. ===================================================================    
  3. --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1150529)    
  4. +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy)    
  5. @@ -767,14 +767,15 @@    
  6.     * @param regionInfo    
  7.     */    
  8.    public void regionOffline(final HRegionInfo regionInfo) {    
  9. +    // remove the region plan as well just in case.    
  10. +    clearRegionPlan(regionInfo);    
  11. +    setOffline(regionInfo);    
  12. +        
  13.      synchronized(this.regionsInTransition) {    
  14.        if (this.regionsInTransition.remove(regionInfo.getEncodedName()) != null) {    
  15.          this.regionsInTransition.notifyAll();    
  16.        }    
  17.      }    
  18. -    // remove the region plan as well just in case.    
  19. -    clearRegionPlan(regionInfo);    
  20. -    setOffline(regionInfo);    
  21.    }   


    即在以上步骤5时,先从regions列表中删除,再清除它的RIT状态。 
    方法2己经测试成功,方法1更简单,各位被这个问题困扰的同学可以一试。

原文链接:koven2049.iteye.com

 

责任编辑:黄丹 来源: nosqlfan
相关推荐

2019-05-09 15:31:23

攻击服务器安全

2021-03-01 07:31:53

消息支付高可用

2013-01-11 15:42:40

IT运维云计算

2023-03-09 12:21:38

2013-03-29 09:15:08

IT运维运维人员运维工程师

2018-03-27 16:23:53

运维AI智能

2018-11-15 08:43:11

交换机硬件故障软件故障

2014-04-23 17:11:57

运维人员访问出错

2010-01-28 10:09:27

IT运维人员

2013-03-21 17:17:34

2015-06-23 14:24:03

2014-11-27 10:07:43

IT运维

2010-02-23 17:12:01

WCF字符串

2022-04-12 07:32:40

引擎模式Spring策略模式

2020-03-19 09:32:10

数据库运维技术

2013-01-23 14:40:06

IT运维RIILCIO

2024-09-23 08:04:45

MYSQL数据存储

2021-09-03 08:44:02

运维安全身份认证堡垒机

2024-08-29 08:54:35

2023-02-02 08:56:25

线程池线程submit
点赞
收藏

51CTO技术栈公众号