`
lc_koven
  • 浏览: 354075 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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)
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
分享到:
评论
5 楼 bin_1715575332 2013-01-20  
好问题,回头好好研究一下!
4 楼 wangjinpeng 2011-12-01  
注意以上最后一步,当master把它从RIT中删除以后,还有短暂的时间这个region还在regions列表中,此时另一个线程拿到了这个region,并且此时这个region不处于RIT状态保护,于是另一个线程开始重复以上过程,而前一个线程己经把它从collection中删除了,于是后一个线程再也无法完成closing事件。直到RIT超时(默认30秒)。

以前遇到过这个问题,但是没有深究,今天看完你的处理,然后又去看了一下代码,发现有点地方不太清楚,这个是我看代码理解的重现过程:

前面都跟你分析的一致,从第二个线程进入开始:
1. 后一个线程拿到一个已经closed的region然后再去disable,不会阻塞,还是会发起closeRegion RPC给RS,然后RS发现online region里面没有这个,抛出NotServingRegionException,HMaster收到这个异常,记录log,然后线程正常退出,此时rit超时时间好像不会超时。
    但是在发送RPC之前unassign方法里会执行这个代码
      state = regionsInTransition.get(encodedName);
      if (state == null) {
        state = new RegionState(region, RegionState.State.PENDING_CLOSE);
        regionsInTransition.put(encodedName, state);
      }
    但是RPC失败线程退出以后,没有将RegionState从RIT删掉,这个region的状态就变为:其实已经下线了,但是RegionState处在RIT中,且为pending——closing。

2. AssignmentManager有一个TimeoutMonitor是一个定时线程,专门用来检查RIT中的异常region,异常指在RIT中提留时间在3分钟以上的Region,并进行修复工作。默认10秒启动一次。启动以后检查到RIT中上面那个异常的Region(假如3分钟过去了),然后打印日志“Region has been PENDING_OPEN for too long, reassigning region=regionName”,然后尝试将它unassign,结果unassign的时候发现在assignment map中不存在这个region(已经被第一个线程setOffline删掉了),然后记录日志“Attempted to unassign region regionName but it is not currently assigned anywhere”,退出。下次10秒启动的时候又会发生,记录日志,在退出,不断循环。

问题应该虽然是disableTable引起的,不过log是TimeoutMonitor产生的,还有TimeoutMonitor的修复工作应该也还可以进一步优化优化。

看完代码的一点体会。。
3 楼 lc_koven 2011-10-20  
lztaomin 写道
请问高手。hbase.bulk.assignment.waiton.empty.rit这个时间设置为多少合适?

30秒吧...不过还是改代码靠谱
2 楼 lztaomin 2011-10-20  
请问高手。hbase.bulk.assignment.waiton.empty.rit这个时间设置为多少合适?
1 楼 杨俊华 2011-08-31  
好文要顶!!
这个问题也困扰我,但我就是重启了事。惭愧惭愧!!

相关推荐

    Oracle数据库Constraint约束的常用操作及异常处理[归类].pdf

    ALTER TABLE dept DISABLE CONSTRAINT pk_dept; ``` 删除约束可以使用ALTER TABLE语句,例如: ```sql ALTER TABLE dept DROP CONSTRAINT pk_dept; ``` 异常处理 在约束操作中可能会出现一些异常,例如数据违反约束...

    Oracle SQL笔记.pdf

    - **使约束失效或生效**:`ALTER TABLE table_name MODIFY CONSTRAINT constraint_name DISABLE|ENABLE;` - **更改表名**:`ALTER TABLE old_table_name RENAME TO new_table_name;` - **删除表**:`DROP TABLE ...

    oracle常用操作(创建数据库等操作)

    ALTER TABLE 表名 DISABLE CONSTRAINT 外键名; -- 进行数据导入 ALTER TABLE 表名 ENABLE CONSTRAINT 外键名; ``` 确保在数据导入完成后,所有引用关系都已正确建立,否则可能引发其他问题。 以上就是Oracle数据库...

    Sybase Reference Manual:commands

    - **用途**:在执行一系列SQL语句时,确保这些操作作为一个整体执行,要么全部成功,要么全部失败。 - **语法**:`BEGIN TRANSACTION [ transaction_name ]` - `transaction_name`:事务的名称(可选)。 - **示例*...

    大数据实验三-HBase编程实践

    - **高可用性和容错性**:HBase具有自动的故障恢复机制,可以在节点失败时继续提供服务。 - **实时读写**:HBase支持快速的数据读取和写入操作,这对于需要实时响应的应用场景非常有用。 #### 二、HBase的Shell...

    oraclejob例子

    它为企业提供了一种自动化处理数据库任务的高效方式,减轻了DBA的工作负担,并确保任务的及时性和准确性。 通过理解并熟练掌握Oracle Job,你可以更好地管理和优化数据库系统的日常运营,提高工作效率,确保数据库...

    cmd操作命令和linux命令大全收集

    arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息 start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令 mem 查看cpu...

    oracle数据库相关操作

    - **登录失败尝试次数**:同样地,可以设置`FAILED_LOGIN_ATTEMPTS`为无限次,以避免因误操作而导致的账户锁定。 - **解决空表无法导出的问题**:通过禁用`deferred_segment_creation`,可以在创建空表时立即分配...

    Properties方法综述2

    首先,Properties方法的优势在于它可以替代效率较低且可能失败的SSDT(System Service Description Table)注入方法,具有更高的优先级。例如,对于显卡补丁,可以参考《Properties-显卡补丁一览表》,而对于PCI设备...

    SQL 新增/修改 表字段列的类型等

    6. **启用/禁用触发器**:通过`ENABLE TRIGGER`和`DISABLE TRIGGER`来控制触发器的活动状态。 7. **更改排序规则(Collation)**:使用`COLLATE`关键字可以更改列的排序规则。 在执行这些操作时,需要注意以下几点...

    Using tms320C6748/C6746/C6742 bootloader

    - **错误处理**: 如果CRC校验失败,AIS可以定义相应的错误处理流程,如图11所示。 - **图11: Handling CRC Error** #### 5. AIS gen: 用于生成Boot Script (AIS Image) 的工具 AIS gen是一款图形界面工具,用于辅助...

    DishServer

    MsgBox(0,"ShowMe","处理文件失败,请查看问题所在。") ExitLoop EndIf Wend FileClose($file) EndIf WEnd ; 关闭搜索句柄 FileClose($search) Case $...

    Oracle9i的init.ora参数中文说明

    说明: 确定查询是否获取表级的读取锁, 以防止在包含该查询的事务处理被提交之前更新任何对象读取。这种操作模式提供可重复的读取, 并确保在同一事务处理种对相同数据的两次查询看到的是相同的值。 值范围: TRUE | ...

    CakePHP-1.2-Cheatsheet

    16. **invalidate(field)**: 使字段无效,通常用于验证失败时。 17. **invalidFields([data])**: 获取无效的字段列表。 18. **isForeignKey(field)**: 判断字段是否为外键。 19. **isUnique(fields,[or])**: 检查...

Global site tag (gtag.js) - Google Analytics