hbase0.98 源码分析-读数据流程

这篇博客详细分析了HBase 0.98版本中读取数据的过程,从客户端的HTable构造及get方法开始,经过HConnection的建立、ExecutorService的配置、RpcCallerFactory的创建,深入到RpcRetryingCaller的调用,重点讲解了如何通过protobuf进行region server的定位和通信。博主还提到了0.96版本后hbase采用protobuf作为通信架构,并给出了Client.proto中的Get相关接口。最后,简述了region server端的HRegionServer.get()方法处理请求的流程。
摘要由CSDN通过智能技术生成

先贴一个总体架构图吧:



我们的客户端程序读取数据(以get为例)通过HTable和Get进行操作,我们从客户端代码开始分析读取数据的流程


conf 里主要是配置zookeeper的连接配置的:


HTable的构造函数:

public HTable(Configuration conf, final TableName tableName)
  throws IOException {
    this.tableName = tableName;
    this.cleanupPoolOnClose = this.cleanupConnectionOnClose = true;
    if (conf == null) {
      this.connection = null;
      return;
    }
    this.connection = HConnectionManager.getConnection(conf);
    this.configuration = conf;

    this.pool = getDefaultExecutor(conf);
    this.finishSetup();
  }

这个方法有三个比较重要的操作:

1、获取HConnection


HConnectionManager 内部缓存着 HConnectionKey 和 HConnectionImplementation 的映射,如果之前已经有连接,就直接从缓存中取就行,如果没有直接创建一个连接:
 HConnectionImplementation connection = CONNECTION_INSTANCES.get(connectionKey);
      if (connection == null) {
        connection = (HConnectionImplementation)createConnection(conf, true);
        CONNECTION_INSTANCES.put(connectionKey, connection);

createConnection 方法通过反射生成HConnectionImplementation对象,通过这个反射对象进行连接

 String className = conf.get("hbase.client.connection.impl",
      HConnectionManager.HConnectionImplementation.class.getName());
    Class<?> clazz = null;
    try {
      clazz = Class.forName(className);

反射之后,创建连接:

 Constructor<?> constructor =
        clazz.getDeclaredConstructor(Configuration.class,
          boolean.class, ExecutorService.class, User.class);
      constructor.setAccessible(true);
      return (HConnection) constructor.newInstance(conf, managed, pool, user);

2、获取ExecutorService,这是一个线程池,这个线程是的一个线程对应一个regionserver

3、finishSetup:配置HTable相关参数,创建 rpcCallerFactory 和 rpcCallerFactory,用于和 regionserver 进行 rpc 调用;还会初始化一个AsyncProcess,用于处理autoflush为false 或者 multiputs 的操作:

/** The Async process for puts with autoflush set to false or multiputs */
  protected AsyncProcess<Object> ap;
……

 this.rpcCallerFactory = RpcRetryingCallerFactory.instantiate(configuration);
    this.rpcControllerFactory = RpcControllerFactory.instantiate(configuration);
    ap = new AsyncProcess<Object>(connection, tableName, pool, null,
        configuration, rpcCallerFactory, rpcControllerFactory);


ok,HTable初始化基本完成,进入HTable.get 方法

 public Result get(final Get get) throws IOException {
    // have to instanatiate this and set the priority here since in protobuf util we don't pass in
    // the tablename... an unfortunate side-effect of public interfaces :-/ In 0.99+ we put all the
    // logic back into HTable
    final PayloadCarryingRpcController controller = rpcControllerFactory.newController();
    controller.setPriority(tableName);
    RegionServerCallable<Result> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值