相信每一个维护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)
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); } 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更简单,各位被这个问题困扰的同学可以一试。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
创建NoSQL数据建模符号 企业架构师亲自上阵
新兴的NoSQL数据风格促使创新的应用程序快速发展,但NoSQL同时也带来了挑战。NoSQL系统能够快速投入生产,有时甚至根本不用创建任何的前期模式。
-
深入理解Amazon DynamoDB NoSQL云数据库服务
Amazon DynamoDB NoSQL云数据库即服务主要为跨移动设备、网页web端、游戏、数字营销和物联网领域的应用提供支持。
-
SQL和NoSQL数据库设计之争
企业收集了很多大规模增长的松散结构化数据,Hadoop,Spark以及其他新技术处理这些数据非常有助于改善商业智能分析效率。
-
深入解读Hadoop十周年——展望篇
本文以技术篇、产业篇、应用篇、展望篇四部分带领大家深入解读Hadoop的昨天、今天和明天,一起憧憬下一个十年。