• disable table 失败的处理


    相信每一个维护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)
    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状态。
  • 相关阅读:
    10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
    数据解析2:JSON解析(2)
    数据解析2:JSON解析(1)
    数据解析1:XML解析(3)
    数据解析1:XML解析(2)
    数据解析1:XML解析(1)
    设计模式4:装饰模式(1)
    设计模式3:模板模式(1)
    设计模式2:工程模式(1)
    设计模式1:单例模式(1)
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205189.html
Copyright © 2020-2023  润新知