hbase的table delete之前需要将该table disable,今天结合源码分析一下disable的过程
首先看客户端HbaseAdmin.java中有接口
public void disableTable(final byte [] tableName)
public void disableTable(final String tableName)
它们的实现都是
public void disableTableAsync(final byte [] tableName) throws IOException {
isMasterRunning();
try {
getMaster().disableTable(tableName);
} catch (RemoteException e) {
throw e.unwrapRemoteException();
}
LOG.info("Started disable of " + Bytes.toString(tableName));
}
这段代码的主要过程是通过rpc远程调用执行HMaster的disableTable();
所以我直接看HMaster的disableTable函数
public void disableTable(final byte [] tableName) throws IOException {
this.executorService.submit(new DisableTableHandler(this, tableName,
catalogTracker, assignmentManager));
}
起了一个新线程DisableTableHadnler
首先判断meta表中是否存在该table,扫描meta表,若meta表不存在table则返回,抛出异常tablenotexist
该线程主要调用
private void handleDisableTable()
将zk上面的/table/ tablename标识为DISABLING
this.assignmentManager.getZKTable().setDisablingTable(this.tableNameStr);
boolean done = false;
while (true) {
// Get list of online regions that are of this table. Regions that are
// already closed will not be included in this list; i.e. the returned
// list is not ALL regions in a table, its all online regions according to
// the in-memory state on this master.
final List<HRegionInfo> regions =
this.assignmentManager.getRegionsOfTable(tableName);
if (regions.size() == 0) {
done = true;
break;
}
LOG.info("Offlining " + regions.size() + " regions.");
BulkDisabler bd = new BulkDisabler(this.server, regions);
try {
if (bd.bulkAssign()) {
done = true;
break;
}
} catch (InterruptedException e) {
LOG.warn("Disable was interrupted");
// Preserve the interrupt.
Thread.currentThread().interrupt();
break;
}
}
// Flip the table to disabled if success.
if (done) this.assignmentManager.getZKTable().setDisabledTable(this.tableNameStr);
获取该table上的所有online的region集合。
对于这些regions bulkassign:起20个线程对所有region进行unassigned
protected void populatePool(ExecutorService pool) {
for (HRegionInfo region: regions) {
if (assignmentManager.isRegionInTransition(region) != null) continue;
final HRegionInfo hri = region;
pool.execute(new Runnable() {
public void run() {
assignmentManager.unassign(hri);
}
});
}
}
如上所示如果该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时
public void nodeCreated(String path) {
if(path.startsWith(watcher.assignmentZNode)) {
synchronized(regionsInTransition) {
try {
RegionTransitionData data = ZKAssign.getData(watcher, path);
if(data == null) {
return;
}
handleRegion(data);
} catch (KeeperException e) {
master.abort("Unexpected ZK exception reading unassigned node data", e);
}
}
}
}
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亦有相应的改变。
分享到:
相关推荐
配置HBase的过程也包括设置`JAVA_HOME`。在`/opt/modules/softwares/hbase-1.2.6/conf/hbase-env.sh`文件中,确保`JAVA_HOME`指向实际的JDK安装路径,例如: ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-...
- `void disableTable(byte[] tableName)`: 禁用一张表。 - `HTableDescriptor[] listTables()`: 列出所有的用户控制表。 - `void modifyTable(byte[] tableName, HTableDescriptor htd)`: 修改表的模式。 - `...
3. **删除表**:同样使用`Admin`接口,调用`disableTable`先禁用表,然后再调用`deleteTable`删除表。 ```java if (admin.tableExists(TableName.valueOf("myTable"))) { admin.disableTable(TableName.valueOf(...
admin.disableTable("wuji"); admin.deleteTable("wuji"); ``` ### 5. 增删改查 使用 HTable 对象进行增删改查操作: ```java HTable table = new HTable(configuration, "wuji"); Put put = new Put("rowkey"); ...
HBase中数据写入最后导致Region分裂的全过程 当HBase中的数据量增长到一定程度时,Region会被分裂。这一过程包括以下几个步骤: 1. **写入数据**:首先,客户端向RegionServer发送数据写入请求。 2. **写入...
admin.disableTable("myTable"); admin.deleteTable("myTable"); ``` 3. **Put操作** Put用于向表中插入数据。创建一个`Put`对象,然后添加`KeyValue`,最后提交到表中。 ```java Table table = connection....
### HBase编程实践知识点 #### 一、HBase在Hadoop体系结构中的角色 HBase是一种分布式的、可扩展的大规模数据存储系统,它构建在Hadoop之上,特别是在Hadoop Distributed File System (HDFS)之上。HBase为结构化...
例如,可以使用`createTable()`方法创建新的表,`disableTable()`和`enableTable()`用于禁用或启用表,`deleteTable()`则用于删除表。 3. 数据读写:对于数据操作,`Table`接口提供了基本的增删查改功能。`Put`对象...
hbase(main):008:0> disable 't1' The table t1 is disabled. ``` #### 九、删除表 - **命令**: `disable 'tablename'`, `drop 'tablename'` - **功能**: 先禁用表,然后删除表。 - **示例**: ```shell hbase...
列族是HBase存储数据的基本单位,它们必须在创建表的时候指定,而且是在创建表的过程中唯一可以指定的属性。 5. 向表中插入数据: - 向test表中的row1行,cf1列族下的greet列中插入字符串'hello':`put 'test', '...
`Admin`接口提供了相应的操作方法,如`enableTable()`, `disableTable()`, `addColumn()`, `deleteTable()`等。 3. **插入数据** HBase的数据是以行(Row)和列(Column)的形式组织的,每一行由行键(Row Key)...
- 例如,使用`HBaseAdmin`类创建和管理表,使用`Table`对象进行数据的put和get,以及`Scan`对象进行表的扫描。 8. **实验环境**: - 实验通常在虚拟机环境中进行,比如VMware Workstation上运行Ubuntu-12.04操作...
HBase是一款基于Google Bigtable论文实现的开源非关系型分布式数据库,它使用Hadoop的HDFS作为其文件存储系统,利用ZooKeeper进行...需要注意的是,在实际操作过程中,应根据具体的HBase集群配置和需求进行相应的调整。
- **基本操作**:使用`Table`接口提供的方法(如`put`、`get`、`delete`等)进行数据的增删改查操作。 - **高级功能**:HBase还提供了更多的高级功能,如过滤器(Filter)、批量操作(Batch)、观察者(Observer)等。 ##...
3. 使用Java API,可以创建自定义方法实现表的创建、数据插入、更新、查询和删除,比如`createTable()`、`addRecord()`、`scanColumn()`、`modifyData()`和`deleteRow()`。 实验总结: 通过这个实验,参与者深入...
hbase(main):007:0> disable 'wp_test' ``` ##### 8. `alter` **功能**:修改表结构,如添加或删除列族。 **命令格式**: ```sh alter '<表名>', METHOD => '<方法名>', NAME => '<列族名>' ``` **示例**: ```sh...
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 (...
7. **关闭与清理**:在完成HBase操作后,使用`disable 'table_name'`禁用表,`drop 'table_name'`删除表,最后通过`stop 'hbase Master'`和`stop 'hbase RegionServer'`停止HBase服务。 **HBase的高级特性** 1. **...
1. **表(Table)**: HBase 中的基本数据结构,由行(Row)、列族(Column Family)和列(Column)组成。 2. **行(Row)**: 表中的每一行都有一个唯一的行键(Row Key),用于定位数据。 3. **列族(Column Family...
本教程将详细讲解HBase的安装过程以及基本操作,帮助你快速入门。 **一、HBase简介** HBase是NoSQL数据库的一种,采用列族存储模式,提供实时读写能力,支持大数据量存储。它利用Hadoop的HDFS作为底层存储,...