相信每一个维护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);
}
即在以上步骤5时,先从regions列表中删除,再清除它的RIT状态。
方法2己经测试成功,方法1更简单,各位被这个问题困扰的同学可以一试。
- 大小: 99.1 KB
分享到:
相关推荐
c# xptable NET中最强,最全功能的表格控件 ...然后,拖动Table, ColumnModel 和 TableModel到Form上,设置Table的ColumnModel 和 TableModel属性,添加Column到ColumnModel,添加Row 和 Cell到TableModel.
此adb中无adb disable-verity命令,如果在cmd中输入以上命令会报 /system/bin/sh: disable-verity: not found 的错误。具体可看本人的文章 ”/system/bin/sh: disable-verity: not found 的解决方案“ 【使用方式】...
蚁剑的能绕过disable_functions的插件,插件无法下载问题
enable and disable "HOME" button in android 4.0.3 above the version 4.0.3,we should modify the frameworks detail is described in the Enable_Disable_Home.rar
由于官方的ibus-table没有五笔(wubi98)的码表,而我又是使用五笔98的,所以自己在官方ibus-table-wubi-1.2.0....#./configure --prefix=/usr --enable-wubi98 --disable-wubi86 #make && make install 2009-10-14
重新编译的支持adb disable-verity命令的adb,通常用于解锁system分区
支持adb disable-verity的最新adb工具包。
reg文件zip包,used for disable ULPS。
td00036 华为以太网交换机vlan disable的功能和配置.doc
本文将为大家介绍交换机出现err-disable的原因及解决方法。
WordPress的插件:google字体插件-disable-google-fonts 解压后,请将目录名称:wordpress1,修改为:disable-google-fonts
针对宝塔的RASP及其disable_functions的绕过1
adb驱动带disable-verity功能,不用添加环境变量,直接双击bat脚本启动,甚至更为小白设计了直接解锁system锁的bat,双击运行直接解锁
Simple.Disable.Key可以修改键盘的热键,进行禁止或者重新组合等,部分电脑可能使用不了,这个具体看自己电脑,慎重下载,这个软件是公认可以修改键盘热键的,可以百度查
disable enchanting table use : true disable items : [ENCHANTMENT_TABLE] tool items : [ANVIL] costs : tier 1 : material : GOLD_INGOT amount : 2 tier 2 : material : GOLD_INGOT amount : 8 tier 3 :...
WIN10R触摸屏驱动程序_1,JONES_Disable_Suspend,其中一个软件
解决Windows10开机黑屏问题,手动修改注册表和自动修改注册表的方法,ulps开启和关闭。
通过这个批处理命令脚本可以轻松的实现enable ipv4和enable ipv6,同时还可以disable ipv4和disable ipv6,同时还可以比较它们enable前和enable后的ip状态
利用PHP扩展模块突破Disable_functions执行命令
window7中android_studio的Ctrl+space没有快捷提示,本生Ctrl+space不知道是不是由于系统设置了是切换输入法,解压该文件,点击里面的reg文件,就可以实现在android-studio进行代码快捷提示