大数据最难源码 hbase 源码 (三)之HBase 创建表 流程源码分析

本文详细讲解了HBase客户端的Connection和Admin组件使用,HTable的理解,以及DDL创建表的服务器端处理流程,包括CreateTableProcedure和InitMetaProcedure的执行机制。深入探讨了CreateTableProcedure的执行逻辑和Meta表的初始化过程。

Connection 和 Admin,HTable 的理解

一个标准的 HBase 客户端程序的写法,来看具体实现:

// 第一步:获取配置
HBaseConfuration conf = HBaseConfuration.create();
// 第二步:获取链接
Connection connection = ConnectionFactory.createConnection(conf);
// 第三步:DDL 和 DML 操作
Admin admin = connection.getAdmin();
// DML 数据处理操作
HTable table = connection.getTable();
// 第四步:具体数据操作
admin.createTable();
table.put(Put put);
table.delete(Delete delete);
Result result = table.get(Get get);
ResultScanner rs = table.getScanner(Scan scan);
// 第五步:结果

在第二步中,会创建 RpcClient。来看具体实现:

ConnectionFactory.createConnection(conf){
   
   
// 获取链接实现类
String className = conf.get(ClusterConnection.HBASE_CLIENT_CONNECTION_IMPL, ConnectionImplementation.class.getName());
// 通过反射创建链接实例
Constructor<?> constructor = clazz.getDeclaredConstructor(Configuration.class, ExecutorService.class, User.class);
(Connection) constructor.newInstance(conf, pool, user){
   
   
// 构造方法
ConnectionImplementation(Configuration conf, ExecutorService pool, User user) throws IOException {
   
   
// 1、批量提交处理器
this.asyncProcess = new AsyncProcess(this, conf, rpcCallerFactory, rpcControllerFactory);
// 2、缓存组件
this.metaCache = new MetaCache(this.metrics);
// 3、 ZK 客户端 
this.registry = ConnectionRegistryFactory.getRegistry(conf){
   
   
//  存储了所有的 znode 节点路径
this.znodePaths = new ZNodePaths(conf);
//  ZK 客户端
this.zk = new ReadOnlyZKClient(conf);
}
 // 4、 RPC 客户端
this.rpcClient = RpcClientFactory.createClient(this.conf, this.clusterId, this.metrics);
}
}
}

客户端的核心四大组件:
AsyncProcess,异步处理器,负责提交请求
MetaCache,存在于客户端用于缓存 Meta 表的相关信息(一个 Map + 两个方法)
ConnectionRegistryFactory,HBase 的 ZK 客户端,客户端会跟 ZK 打交道获取 Meta 的信息
RpcClient,RPC 客户端

Procedure 和 ProcedureExecutor 详解

当 HMaster 接收到一个 createTable() 的 RPC 请求的时候,封装成一个 CreateTableProcedure 提交到 ProcedureExecutor。ProcedureExecutor 在
HMaster 启动的时候,会初始化启动。
ProcedureExecutor 创建和初始化
ProcedureExecutor 启动
ProcedureExecutor 接收 Procedure 执行处理

// 当 HMaster 选举成为
HMaster.finishActiveMasterInitialization(){
   
   
// 创建 ProcedureExecutor 实例,内部创建了默认至少 16 个线程
createProcedureExecutor(){
   
   
// 获取 ProcedureScheduler
MasterProcedureEnv procEnv = new MasterProcedureEnv(this);
MasterProcedureScheduler procedureScheduler = procEnv.getProcedureScheduler();
// 用于持久化 procedure 的状态
procedureStore = new RegionProcedureStore();
// 创建 ProcedureExecutor
procedureExecutor = new ProcedureExecutor<>(conf, procEnv, procedureStore, procedureScheduler);
// RegionProcedureStore 启动
procedureStore.start(numThreads);
// ProcedureExecutor 初始化
procedureExecutor.init(numThreads, abortOnCorruption){
   
   
// 初始化工作线程
workerThreads = new CopyOnWriteArrayList<>();
for(int i = 0; i < corePoolSize;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值