1.X Hbase的ConnectionFactory源码解析

HBase 1.x弃用了旧的HConnectionManager创建连接方式,改用ConnectionFactory。重点介绍了ConnectionFactory的createConnection方法,该方法是创建连接的核心。HConnectionImplementation的close方法负责资源管理和减少使用计数。单个连接可在多个Table和Admin实例间共享,连接是线程安全的,而Table和Admin则不是。推荐每个客户端应用仅实例化一个连接,线程各自获取Table实例,读写后关闭Table,进程结束时关闭Connection。

hbase到了1.x之后放弃了这种创建工厂的方式:
@deprecated Please use ConnectionFactory instead
Connection connection =HConnectionManager.createConnection(conf);
改用ConnectionFactory 类来创建hbase客户端连接

ConnectionFactory 这个类的主要方法如下:

其中最主要的是这个createConnection(final Configuration conf, final boolean managed, final ExecutorService pool, final User user)带有四个参数的方法,其他方法最终都是调用这个方法。由于这个方法没有public,所以我们还是只能调用其重载的方法。

  /* @param conf configuration 配置
   *为哪个用户创建的连接,这里的用户会默认实例化hadoop的SecureHadoopUser类,个人认为:hbase通过hadoop的安全认证来管理hbase集群。
   * @param user the user the connection is for
   * 用于批量操作的线程池,默认为null。这里使用线程池来管理连接,一个线程对应一个连接,其实一个连接,但是我们也可以不传线程池,这种情况下,只会实例化一个不带线程池的连接
   * @param pool the thread pool to use for batch operations
   * 返回连接对象
   * @return Connection object for <code>conf</code>
   * 这里的参数managed,该参数用于connection的生命周期管理,在上述的传递过程中该参数始终为false,关于该参数的作用,在connection close的时候体现
   * indicates whether this connection's life cycle is managed (by us)
   * 表示这个连接的管理权是用户,还是有connection对象自己管理
   * 如果管理权是属于用户的那么在调用close方法时有区别。
   */

static Connection createConnection(final Configuration c
```java package step1; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellScanner; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.util.Bytes; public class Task { public void batchGet() throws Exception { /********* Begin *********/ // 创建 HBase 配置 Configuration config = HBaseConfiguration.create(); // 建立连接 Connection connection = ConnectionFactory.createConnection(config); // 获取表名 TableName tableName = TableName.valueOf("your_table_name"); // 获取表对象 Table table = connection.getTable(tableName); // 定义要获取的行键列表 List<String> rows = new ArrayList<>(); rows.add("row1"); rows.add("row2"); rows.add("row3"); // 创建 Get 对象列表 List<Get> gets = new ArrayList<>(); for (String str : rows) { Get get = new Get(Bytes.toBytes(str)); gets.add(get); } // 批量获取数据 Result[] results = table.get(gets); // 处理结果 for (Result result : results) { System.out.println("Row:" + Bytes.toString(result.getRow())); for (Cell kv : result.rawCells()) { String family = Bytes.toString(CellUtil.cloneFamily(kv)); String qualifier = Bytes.toString(CellUtil.cloneQualifier(kv)); String value = Bytes.toString(CellUtil.cloneValue(kv)); System.out.println(family + ":" + qualifier + "\t" + value); } } // 关闭资源 table.close(); connection.close(); /********* End *********/ } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值