`

HBase disable table

 
阅读更多

 

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

 


 

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

 

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

Java代码   收藏代码
  1. public void disableTable(final byte [] tableName)  
Java代码   收藏代码
  1. public void disableTable(final String tableName)  

 它们的实现都是

Java代码   收藏代码
  1.   public void disableTableAsync(final byte [] tableName) throws IOException {  
  2.     isMasterRunning();  
  3.     try {  
  4.       getMaster().disableTable(tableName);  
  5.     } catch (RemoteException e) {  
  6.       throw e.unwrapRemoteException();  
  7.     }  
  8.     LOG.info("Started disable of " + Bytes.toString(tableName));  
  9.   }  

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

 所以我直接看HMaster的disableTable函数

Java代码   收藏代码
  1. public void disableTable(final byte [] tableName) throws IOException {  
  2.     this.executorService.submit(new DisableTableHandler(this, tableName,  
  3.       catalogTracker, assignmentManager));  
  4.   }  

 起了一个新线程DisableTableHadnler

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

该线程主要调用

Java代码   收藏代码
  1. private void handleDisableTable()  

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

Java代码   收藏代码
  1. this.assignmentManager.getZKTable().setDisablingTable(this.tableNameStr);  
Java代码   收藏代码
  1. boolean done = false;  
  2.     while (true) {  
  3.       // Get list of online regions that are of this table.  Regions that are  
  4.       // already closed will not be included in this list; i.e. the returned  
  5.       // list is not ALL regions in a table, its all online regions according to  
  6.       // the in-memory state on this master.  
  7.       final List<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.       BulkDisabler bd = new BulkDisabler(this.server, regions);  
  15.       try {  
  16.         if (bd.bulkAssign()) {  
  17.           done = true;  
  18.           break;  
  19.         }  
  20.       } catch (InterruptedException e) {  
  21.         LOG.warn("Disable was interrupted");  
  22.         // Preserve the interrupt.  
  23.         Thread.currentThread().interrupt();  
  24.         break;  
  25.       }  
  26.     }  
  27.     // Flip the table to disabled if success.  
  28.     if (done) this.assignmentManager.getZKTable().setDisabledTable(this.tableNameStr);  

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

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

Java代码   收藏代码
  1. protected void populatePool(ExecutorService pool) {  
  2.       for (HRegionInfo region: regions) {  
  3.         if (assignmentManager.isRegionInTransition(region) != nullcontinue;  
  4.         final HRegionInfo hri = region;  
  5.         pool.execute(new Runnable() {  
  6.           public void run() {  
  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. public void nodeCreated(String path) {  
  2.   if(path.startsWith(watcher.assignmentZNode)) {  
  3.     synchronized(regionsInTransition) {  
  4.       try {  
  5.         RegionTransitionData data = ZKAssign.getData(watcher, path);  
  6.         if(data == null) {  
  7.           return;  
  8.         }  
  9.         handleRegion(data);  
  10.       } catch (KeeperException e) {  
  11.         master.abort("Unexpected ZK exception reading unassigned node data", 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亦有相应的改变。

分享到:
评论

相关推荐

    java操作Hbase之实现表的创建删除源码

    3. **删除表**:同样使用`Admin`接口,调用`disableTable`先禁用表,然后再调用`deleteTable`删除表。 ```java if (admin.tableExists(TableName.valueOf("myTable"))) { admin.disableTable(TableName.valueOf(...

    安装HBase,并启动运行

    4. 删除列族:先禁用表(`disable 'table1'`),然后删除列族(`alter 'table1', {NAME=&gt;'tab1_add', METHOD=&gt;'delete'}`),最后启用表(`enable 'table1'`) 5. 删除表:先禁用表(`disable 'table1'`),然后删除...

    HBase Java API类介绍

    - `void disableTable(byte[] tableName)`: 禁用一张表。 - `HTableDescriptor[] listTables()`: 列出所有的用户控制表。 - `void modifyTable(byte[] tableName, HTableDescriptor htd)`: 修改表的模式。 - `...

    Java操作Hbase进行建表、删表以及对数据进行增删改查

    admin.disableTable("wuji"); admin.deleteTable("wuji"); ``` ### 5. 增删改查 使用 HTable 对象进行增删改查操作: ```java HTable table = new HTable(configuration, "wuji"); Put put = new Put("rowkey"); ...

    hbase常用JAVA API

    admin.disableTable("myTable"); admin.deleteTable("myTable"); ``` 3. **Put操作** Put用于向表中插入数据。创建一个`Put`对象,然后添加`KeyValue`,最后提交到表中。 ```java Table table = connection....

    java大数据作业_3HBase

    disable 'notes' drop 'notes' ``` #### 8. 简述HBase的表操作对象 HBase提供了多种API来操作表,包括: - `Admin`: 用于管理表,如创建、删除表等。 - `Table`: 用于执行对表的具体操作,如插入、查询数据等。 - ...

    最新版linux hbase-2.3.2-client-bin.tar.gz

    例如,可以使用`createTable()`方法创建新的表,`disableTable()`和`enableTable()`用于禁用或启用表,`deleteTable()`则用于删除表。 3. 数据读写:对于数据操作,`Table`接口提供了基本的增删查改功能。`Put`对象...

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

    ### HBase编程实践知识点 #### 一、HBase在Hadoop体系结构中的角色 HBase是一种分布式的、可扩展的大规模数据存储系统,它构建在Hadoop之上,特别是在Hadoop Distributed File System (HDFS)之上。HBase为结构化...

    hbase shell常用命令汇总

    hbase(main):008:0&gt; disable 't1' The table t1 is disabled. ``` #### 九、删除表 - **命令**: `disable 'tablename'`, `drop 'tablename'` - **功能**: 先禁用表,然后删除表。 - **示例**: ```shell hbase...

    HBASE API

    `Admin`接口提供了相应的操作方法,如`enableTable()`, `disableTable()`, `addColumn()`, `deleteTable()`等。 3. **插入数据** HBase的数据是以行(Row)和列(Column)的形式组织的,每一行由行键(Row Key)...

    Hbase 的shell基本操作

    - 扫描test表中的所有数据,类似于SQL中的SELECT * FROM table:`scan 'test'`。 8. 删除表中的数据: - 删除test表中row1行,cf1列族下的greet列的数据:`delete 'test', 'row1', 'cf1:greet'`。 9. 禁用表: ...

    hadoop及hbase部署与应用

    - 例如,使用`HBaseAdmin`类创建和管理表,使用`Table`对象进行数据的put和get,以及`Scan`对象进行表的扫描。 8. **实验环境**: - 实验通常在虚拟机环境中进行,比如VMware Workstation上运行Ubuntu-12.04操作...

    大数据技术原理及应用课实验3 熟悉常用的HBase操作 林子雨实验

    3. 使用Java API,可以创建自定义方法实现表的创建、数据插入、更新、查询和删除,比如`createTable()`、`addRecord()`、`scanColumn()`、`modifyData()`和`deleteRow()`。 实验总结: 通过这个实验,参与者深入...

    hbase-hadoop+database系统入门书籍

    - **基本操作**:使用`Table`接口提供的方法(如`put`、`get`、`delete`等)进行数据的增删改查操作。 - **高级功能**:HBase还提供了更多的高级功能,如过滤器(Filter)、批量操作(Batch)、观察者(Observer)等。 ##...

    HBaseShell常用命令中文最新版本

    示例命令:`disable 'table1'` 和 `enable 'table1'` 先禁用`table1`表,使其无法进行读写操作,然后再启用它。 11. `drop`:删除表。 示例命令:`drop 'table1'` 删除`table1`表。 以上是HBaseShell中一些...

    hbase和hive常用命令记录总结

    CREATE EXTERNAL TABLE hbase_gpsinfo (key STRING, value STRING) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,i:c") TBLPROPERTIES (...

    hbase shell操作指南

    禁用表可以使用`disable`命令,格式为`disable '&lt;表名&gt;'`。启用表则使用`enable`命令,格式为`enable '&lt;表名&gt;'`。 11. 清空表 清空表指的是删除表中的所有数据,但保留表结构。可以使用`truncate`命令来完成此操作...

    hbase shell

    hbase(main):007:0&gt; disable 'wp_test' ``` ##### 8. `alter` **功能**:修改表结构,如添加或删除列族。 **命令格式**: ```sh alter '&lt;表名&gt;', METHOD =&gt; '&lt;方法名&gt;', NAME =&gt; '&lt;列族名&gt;' ``` **示例**: ```sh...

    Hbase的安装与简单操作

    7. **关闭与清理**:在完成HBase操作后,使用`disable 'table_name'`禁用表,`drop 'table_name'`删除表,最后通过`stop 'hbase Master'`和`stop 'hbase RegionServer'`停止HBase服务。 **HBase的高级特性** 1. **...

    hbase的搭建

    1. **表(Table)**: HBase 中的基本数据结构,由行(Row)、列族(Column Family)和列(Column)组成。 2. **行(Row)**: 表中的每一行都有一个唯一的行键(Row Key),用于定位数据。 3. **列族(Column Family...

Global site tag (gtag.js) - Google Analytics