浏览 2853 次
锁定老帖子 主题:disable table失败的处理
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-30
这个问题产生的原因非常讨厌,经过一段时间的分析和验证,得到了根本原因。要理解它,必须从disable的原理说起:
注意以上最后一步,当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 修改代码: Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1150529) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -767,14 +767,15 @@ * @param regionInfo */ public void regionOffline(final HRegionInfo regionInfo) { + // remove the region plan as well just in case. + clearRegionPlan(regionInfo); + setOffline(regionInfo); + synchronized(this.regionsInTransition) { if (this.regionsInTransition.remove(regionInfo.getEncodedName()) != null) { this.regionsInTransition.notifyAll(); } } - // remove the region plan as well just in case. - clearRegionPlan(regionInfo); - setOffline(regionInfo); } 即在以上步骤5时,先从regions列表中删除,再清除它的RIT状态。 方法2己经测试成功,方法1更简单,各位被这个问题困扰的同学可以一试。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |