文章目录
  1. HBase源码02_HBaseAdmin初探
  2. 1. 代码示例 (kotlin)
  3. 2. 解析
    1. 2.1 获取Admin实例
    2. 2.2 listNamespaceDescriptors 方法
  4. 3. 总结

[TOC]

HBase源码02_HBaseAdmin初探

1. 代码示例 (kotlin)

上节我们知道 connection 返回的是 HConnectionImplementation。这节以最基本的 listNamespaceDescriptors 解析。

1
2
3
4
5
6
7
8
9
// 查看 hbase 所有的 namespaces
@Test
fun testConnection() {
val connection = ConnectionFactory.createConnection()
// 获取 admin 操作
println(connection.admin.listNamespaceDescriptors())

connection.close()
}

2. 解析

2.1 获取Admin实例

1
2
3
4
5
6
7
8
// 可以看出来返回的 HBaseAdmin 对象
@Override
public Admin getAdmin() throws IOException {
if (managed) {
throw new NeedUnmanagedConnectionException();
}
return new HBaseAdmin(this);
}

HBaseAdmin 提供基本的DDL等操作,如 创建NameSpace, 创建表, 判断表是否存在, 查看表列表, 删除表 等等。

构造方法里面获取connection初始化的信息,如rpcCallerFactoryrpcControllerFactory等。

2.2 listNamespaceDescriptors 方法

  • 实际调用,下面一步步分析

  • 1、创建一个 MasterCallable, 返回 NamespaceDescriptor[] 类型

    • MasterCallable 构造方法中,获取 MasterService。方法位于 ConnectionManager#getKeepAliveMasterService(),这里面最重要就是初始化 stub 对象, stubprotobuf 生成的代码。 代码如下:
    • 关于 stubchannelrpcClient 的关系和联系,可以参考 Protobuf的RPC使用。后续的各种表操作,都是基于这个 stub 完成的

      1
      2
      3
      this.masterServiceState.stub = stubMaker.makeStub();

      >> 上面代码最终进入到 ConnectionManager#makeStubNoRetries() 方法中

  • 2、master 初始化完毕后, 继续执行 call 里面的代码, 主要方法就是 master.listNamespaceDescriptors(...)

    • 点进去,实际调用 stublistNamespaceDescriptors方法
    • 继续点进去, 就是 channelcallBlockingMethodchannel 的实现是 BlockingRpcChannelImplementation
    • 最后就是 rpcClientcallBlockingMethod 方法。这个过程其实是将RPC调用需要的方法名, 参数, 返回类型, Master地址等进行传输。最终调用的就是 RpcClientImpl 里面的 NIO 相关的代码(用的hadoop封装的代码)。
  • 3、最终调用远程 HBase Master 的方法, 即 MasterRpcServices#listNamespaceDescriptors 方法。

    • 点进去,调用 HMaster#listNamespaceDescriptors() 方法

最后执行的代码就是去获取(scan) hbase:namespace 表中的数据,类似hbase-shell命令行敲入:$ scan 'hbase:namespace'scanget等过程,这个后面再说。

3. 总结

这一节,主要是走通 clientmaster 之间的通信过程。

文章目录
  1. HBase源码02_HBaseAdmin初探
  2. 1. 代码示例 (kotlin)
  3. 2. 解析
    1. 2.1 获取Admin实例
    2. 2.2 listNamespaceDescriptors 方法
  4. 3. 总结