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

    这个问题产生的原因非常讨厌,经过一段时间的分析和验证,得到了根本原因。要理解它,必须从disable的原理说起:

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

  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状态。

disable table 失败的处理的更多相关文章

  1. [20190524]DISABLE TABLE LOCK(12c).txt

    [20190524]DISABLE TABLE LOCK(12c).txt --//如果禁止table lock时,一些ddl操作会被禁止.但是我有点吃惊的是增加字段不受限制.--//链接:http: ...

  2. [20190522]DISABLE TABLE LOCK.txt

    [20190522]DISABLE TABLE LOCK.txt --//如果禁止table lock时,一些ddl操作会被禁止.但是我有点吃惊的是增加字段不受限制.--//通过测试说明问题. 1.环 ...

  3. Django同步创建models table失败

    django1.8通过manage.py syncdb 执行同步创建models中创建的表格失败 由于syncdb命令在1.9版本中会被remove, 需要改用makemigrations命令进行代替 ...

  4. mysql delete from table 失败

    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; TRUNCATE TABLE ...

  5. Oracle诊断:drop table失败[转]

    转: From <http://blog.csdn.net/cyxlxp8411/article/details/7775113> 今天在drop一张表的时候报ORA-00054错误 SQ ...

  6. db2 reorg table failed处理

    概要: 当对一个表的结构进行改变后,需要reorg表,重新组织其目录统计信息,为数据库的访问计划提供信息,以便高效执行对其的操作. 对表作reorg操作,发生错误,通过db2 "? sql0 ...

  7. HBase学习

    记录HBase的学习过程.之后会陆续添加内容. 阅读hbase的博客,理解hbase是什么.推荐博文: 1,HBase原理,基础架构,基础概念 2,HBase超详细介绍 --------------- ...

  8. mysql5.5手册读书日记(3)

    <?php /* MySQL_5.5中文参考手册 587开始 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修 ...

  9. 禁用sqlserver的锁升级

    锁升级 SQLSERVER.DB2中的锁是内存里面实现的,这就有个资源消耗问题,当锁的数量达到一个阀值或内存有压力时,就会引发锁升级.实际的情况是从row lock直接升级到table lock,而不 ...

随机推荐

  1. 开源IMDG之GridGain

    作为另一款主流的开源数据网格产品,GridGain是Hazelcast的强有力竞争者.同样提供了社区版和商业版,近日GridGain的开源版本已经进入Apache孵化器项目Ignite(一款开源的内存 ...

  2. Dynamics CRM 插件注册时报Assembly must be registered in isolation的解决方法

    在插件注册的时候经常会遇到"Assembly must be registered in isolation"的问题导致无法注册,之前经常会被同事或者朋友问到这个问题,遇到这个问题 ...

  3. ORACLE数据库学习之体系结构

     Oracle体系结构 ORACLE数据库体系结构决定了oracle如何使用网络.磁盘和内存.包括实例(instance),文件(file)和进程(process不包括后台进程)三部分. 实例:每 ...

  4. 早期Swift中Cocos2D初始化代码的重构

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在早期的Swift中在子类里只能调用超类的design ...

  5. COM原理与实现之一

    COM原理与实现之一 COM组件其实是一种特殊的对象体系,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个对象的方法,也就可以做到组件调用.COM就是统一的标准--通过接口来调用COM组件. ...

  6. hbase操作(shell 命令,如建表,清空表,增删改查)以及 hbase表存储结构和原理

    两篇讲的不错文章 http://www.cnblogs.com/nexiyi/p/hbase_shell.html http://blog.csdn.net/u010967382/article/de ...

  7. Android初级教程:单击事件的传递机制初谈

    以上仅是小试牛刀,后续有很多事件传递机制,继续探讨.

  8. struts extjs 3.3.1 读取JSON文件

    json文件和脚本代码: jsonSrc/jsonTxt1.json, { "personInfoList": [ { "id": 0, "name& ...

  9. Linux中printk()实例

    新建hello.c #include <linux/kernel.h> #include <linux/module.h> int init_module(void) { pr ...

  10. Android列表视图ListView和ListActivity-android学习之旅(二十四)

    ListView简介 ListView是android中常用的一种控件,创建ListView有两种方式: 1.在xml中使用ListView控件创建. 2.使用activity继承ListActivi ...