hbase ddl流程分析
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;

本文详细讲解了HBase客户端的Connection和Admin组件使用,HTable的理解,以及DDL创建表的服务器端处理流程,包括CreateTableProcedure和InitMetaProcedure的执行机制。深入探讨了CreateTableProcedure的执行逻辑和Meta表的初始化过程。
之HBase 创建表 流程源码分析&spm=1001.2101.3001.5002&articleId=122180631&d=1&t=3&u=1c4c68809bb9445392dd1b239f3d00b7)
1062

被折叠的 条评论
为什么被折叠?



