文章目录
  1. Hbase源码03_创建表
  2. 1. 代码示例 (kotlin)
  3. 2. 解析
  4. 3. 分析建表过程
    1. 3.1 createFsLayout 方法
    2. 3.2 addTableToMeta 方法
    3. 3.3 assignRegions 方法
    4. 3.4 updateTableDescCache 方法
  5. 4. 总结

[TOC]

Hbase源码03_创建表

1. 代码示例 (kotlin)

1
2
3
4
5
6
7
8
9
10
11
12
@Test
fun testCreateTable() {
// 创建连接
val connection = ConnectionFactory.createConnection()
val admin = connection.admin
// 创建表
val table = HTableDescriptor(TableName.valueOf("test:myTable"))
table.addFamily(HColumnDescriptor("cf"))
admin.createTable(table)
// 关闭
connection.close()
}

上节知道, admin返回的是HBaseAdmin对象, 下面直接进入 admin.createTable

2. 解析

  • 1、中间有个创建 splitKeys 的过程, 默认是null。是一个 byte[][]类型,存放切的点
1
2
3
4
比如 splitKeys = new byte[][]{ Bytes.toBytes(10), Bytes.toBytes(30) }
那么就从rowKey为10和30的地方切, 最后形成3个region

> 建议尽量设置splitKeys的值
  • 2、执行方法: createTableAsyncV2

    • 校验 splitKeys 的正确性
    • 跟上节一样,执行 MasterCallablecall 方法
    • 通过 stub 等RPC执行,然后执行MasterRpcServices#createTable,这里过程可以看上节。
  • 3、这里进入Master端,最终执行 HMaster#createTable 方法(后续再说关于HMaster的启动)

  • 4、执行 ProcedureExecutor#submitProcedure 提交任务

procedures 是一个 ConcurrentHashMap, ProcedureExecutor#start方法会启动一个线程一直去消费 procedures

由于 CreateTableProcedure 继承自 StateMachineProcedure#execute, 是个状态机引擎处理类。调用CreateTableProcedure#executeFromState 方法。先大致走个整体流程。

3. 分析建表过程

3.1 createFsLayout 方法

原注释的过程写的还挺清楚,基本就是创建对应的目录等,由于HBase中的namespace列族region等信息对应到HDFS中就是个目录,类似Hive的表和分区信息详细可以参考这里

第二步创建region对象,点进方法,将创建regions的动作交给了线程池去执行。最终执行 HRegion#createHRegion(...) 方法。最后实例化 HRegion对象,里面包含数据等很多重要的东西,略复杂。

3.2 addTableToMeta 方法

由于 hbase:meta 在HBase中也是一张表,所以代码内部创建一个 Put 对象进行数据的插入,关于Put后续进行分析。

3.3 assignRegions 方法

  • 然后执行 assign 方法

  • 继续 assignassign 方法,里面代码略复杂。里面生成region的计划,然后就是将 region 在远程的 server 上 open,方法是 serverManager.sendRegionOpen(...)

  • 最后RPC调用对应 server 的 RSRpcServicesopenRegion 方法。创建所有的 HRegion 实例。

3.4 updateTableDescCache 方法

1
2
3
4
protected static void updateTableDescCache(final MasterProcedureEnv env, final TableName tableName) throws IOException {
// 获取表信息, 内部会进行缓存。
env.getMasterServices().getTableDescriptors().get(tableName);
}

4. 总结

总体来说,建表的过程还是挺复杂的。不过基本离不开整体HBase架构,各种与ZKHDFS等交互,各种通过RPC进行集群间通讯。还有各种元数据的维护

文章目录
  1. Hbase源码03_创建表
  2. 1. 代码示例 (kotlin)
  3. 2. 解析
  4. 3. 分析建表过程
    1. 3.1 createFsLayout 方法
    2. 3.2 addTableToMeta 方法
    3. 3.3 assignRegions 方法
    4. 3.4 updateTableDescCache 方法
  5. 4. 总结