设为首页 加入收藏

TOP

HBase disable table
2019-04-23 13:46:45 】 浏览:72
Tags:HBase disable table

HBase disable table的过程(转,删除表之前先disable table)


hbase的table delete之前需要将该table disable,今天结合源码分析一下disable的过程

首先看客户端HbaseAdmin.java中有接口

Java代码收藏代码
  1. publicvoiddisableTable(finalbyte[]tableName)
Java代码收藏代码
  1. publicvoiddisableTable(finalStringtableName)

它们的实现都是

Java代码收藏代码
  1. publicvoiddisableTableAsync(finalbyte[]tableName)throwsIOException{
  2. isMasterRunning();
  3. try{
  4. getMaster().disableTable(tableName);
  5. }catch(RemoteExceptione){
  6. throwe.unwrapRemoteException();
  7. }
  8. LOG.info("Starteddisableof"+Bytes.toString(tableName));
  9. }

这段代码的主要过程是通过rpc远程调用执行HMaster的disableTable();

所以我直接看HMaster的disableTable函数

Java代码收藏代码
  1. publicvoiddisableTable(finalbyte[]tableName)throwsIOException{
  2. this.executorService.submit(newDisableTableHandler(this,tableName,
  3. catalogTracker,assignmentManager));
  4. }

起了一个新线程DisableTableHadnler

首先判断meta表中是否存在该table,扫描meta表,若meta表不存在table则返回,抛出异常tablenotexist

该线程主要调用

Java代码收藏代码
  1. privatevoidhandleDisableTable()

将zk上面的/table/tablename标识为DISABLING

Java代码收藏代码
  1. this.assignmentManager.getZKTable().setDisablingTable(this.tableNameStr);
Java代码收藏代码
  1. booleandone=false;
  2. while(true){
  3. //Getlistofonlineregionsthatareofthistable.Regionsthatare
  4. //alreadyclosedwillnotbeincludedinthislist;i.e.thereturned
  5. //listisnotALLregionsinatable,itsallonlineregionsaccordingto
  6. //thein-memorystateonthismaster.
  7. finalList<HRegionInfo>regions=
  8. this.assignmentManager.getRegionsOfTable(tableName);
  9. if(regions.size()==0){
  10. done=true;
  11. break;
  12. }
  13. LOG.info("Offlining"+regions.size()+"regions.");
  14. BulkDisablerbd=newBulkDisabler(this.server,regions);
  15. try{
  16. if(bd.bulkAssign()){
  17. done=true;
  18. break;
  19. }
  20. }catch(InterruptedExceptione){
  21. LOG.warn("Disablewasinterrupted");
  22. //Preservetheinterrupt.
  23. Thread.currentThread().interrupt();
  24. break;
  25. }
  26. }
  27. //Flipthetabletodisabledifsuccess.
  28. if(done)this.assignmentManager.getZKTable().setDisabledTable(this.tableNameStr);

获取该table上的所有online的region集合。

对于这些regions bulkassign:起20个线程对所有region进行unassigned

Java代码收藏代码
  1. protectedvoidpopulatePool(ExecutorServicepool){
  2. for(HRegionInforegion:regions){
  3. if(assignmentManager.isRegionInTransition(region)!=null)continue;
  4. finalHRegionInfohri=region;
  5. pool.execute(newRunnable(){
  6. publicvoidrun(){
  7. assignmentManager.unassign(hri);
  8. }
  9. });
  10. }
  11. }

如上所示如果该Region已经在master的RIT队列中,则说明该region正在被处理,则忽略之

下面我们来看unassigned过程:

1. 该region必须online,在master的online队列中存在

2. 若该region在master的RIT队列中,且其state的状态是PENDING且force=true即表示即使该region正在closing ,force参数指定该region should be closed;

若在RIT中且不符合上面条件则忽略返回;

若不存在则将当前Region加入RIT队列中

3. serverManager.sendRegionClose(server, state.getRegion()),Master端与该Region所在RS进行通信,RPC调用HRegionServer的closeRegion(region)函数

HRegionServer端

closeRegion(region)

1. 该region在RS的online regions列表上

2. 起一个线程CloseRegionhandler实现以下步骤

1)setClosingState,在zk上创建unassigned下的该region节点将其值置为RS_ZK_REGION_CLOSING

2)region.close(abort),关闭region,主要是关闭region下每个Store的每个HFile的reader

3)将region从当前online列表中移除

4)在zk上将该节点置为RS_ZK_REGION_CLOSED

5)从RS的RIT队列中移除该region

Server端的主要逻辑即为如上所示

在上面过程中由于对zk上的unassigned节点进行了created和changed,且master端watch了该节点,当这些节点发生变化时会使得Master端也发生变化。

1)created时

Java代码收藏代码
  1. publicvoidnodeCreated(Stringpath){
  2. if(path.startsWith(watcher.assignmentZNode)){
  3. synchronized(regionsInTransition){
  4. try{
  5. RegionTransitionDatadata=ZKAssign.getData(watcher,path);
  6. if(data==null){
  7. return;
  8. }
  9. handleRegion(data);
  10. }catch(KeeperExceptione){
  11. master.abort("UnexpectedZKexceptionreadingunassignednodedata",e);
  12. }
  13. }
  14. }
  15. }

handleRegion的过程是将Master的RIT队列中该region的state置为CLOSING

2)变成Closed时

handleRegion将该region的state置为CLOSED然后力气一个线程CloseRegionHandler,此时如果zk上面/table下存在该table的节点,那么offlineDisabledRegion(HRegionInfo regionInfo)

1.删除zk上的unassigned节点,

2.clear regionplan

3.从Master的online region和server上移除该region

4.RIT中移除

整个过程结束。首先与hmaster进行通信,而后hmaster和rs进行通信,关闭region上各个HStore的Hfile的reader,在这个过程中涉及zk上节点的变化,master亦有相应的改变。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Ubuntu下安装单机版hbase 下一篇hbase监控简单实用脚本

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目