现在的位置: 首页 > 综合 > 正文

HBase概念学习(六)java API之HTable与HTablePool

2019年10月14日 ⁄ 综合 ⁄ 共 2619字 ⁄ 字号 评论关闭

在HBase中,HTable封装表格对象,对表格的增删改查操作主要通过它来完成,构造方法如下:
        HTable table=new HTable(config,tableName);
在构建多个HTable对象时,HBase推荐所有的HTable使用同一个Configuration。这样,HTable之间便可共享HConnection对象、zookeeper信息以及Region地址的缓存信息。

用法示例:

  1. HTable table = newHTable(conf, Bytes.toBytes(tablename));  
  2. ResultScanner scanner=  table.getScanner(family);  

下面是HTable的常用方法:

返回值

函数

描述

void

checkAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put

自动的检查row/family/qualifier是否与给定的值匹配

void

close()

释放所有的资源或挂起内部缓冲区中的更新

Boolean

exists(Get get)

检查Get实例所指定的值是否存在于HTable的列中

Result

get(Get get)

获取指定行的某些单元格所对应的值

byte[][]

getEndKeys()

获取当前一打开的表每个区域的结束键值

ResultScanner

getScanner(byte[] family)

获取当前给定列族的scanner实例

HTableDescriptor

getTableDescriptor()

获取当前表的HTableDescriptor实例

byte[]

getTableName()

获取表名

static boolean

isTableEnabled(HBaseConfiguration conf, String tableName)

检查表是否有效

void

put(Put put)

向表中添加值

(1)创建HTable对象非常耗时:

你可能会觉得每次要操作表的时候就创建一个HTable对象,但是不幸地告诉你,创建HTable对象是一个非常耗时的操作,如果每秒几千个操作表的请求,那么每次都创建一个HTable实例基本上不可行。即时它们共用一个HConfiguration也无济于事。

(2)HTable对象非线程安全:

你可能又会想到创建一个HTable对象来在多个线程之间共用,还是不幸地告诉你,HTable对象不是线程安全的。


怎么解决这个问题呢?

使用HTablePool类就可以解决这个问题,这个类只有一个目的:为HBase集群提供客户端连接池。

下面是创建HTablePool连接池的例子:

Configuration conf = HBaseConfiguration.create(); 
HTablePool pool = new HTablePool(conf, 10);

HTablePool可以自动创建HTable对象,而且对客户端来说使用上是完全透明的,可以避免多线程间数据并发修改问题。
HTablePool中的HTable对象之间是公用Configuration连接的,能够可以减少网络开销。


HTablePool的使用很简单:

每次进行操作前,通过HTablePool的getTable方法取得一个HTable对象,然后进行put/get/scan/delete等操作,最后通过HTablePool的putTable方法将HTable对象放回到HTablePool中。

下面是个使用HTablePool的简单例子:

HTableInterface table = pool.getTable(UserTable.NAME); 
Put put = new Put(Bytes.toBytes(username));
put.add(UserTable.DATA_FAMILY, UserTable.FIRSTNAME,  Bytes.toBytes(firstName));   
put.add(UserTable.DATA_FAMILY, UserTable.LASTNAME,  Bytes.toBytes(lastName));   
put.add(UserTable.DATA_FAMILY, UserTable.EMAIL, Bytes.toBytes(email));
put.add(UserTable.DATA_FAMILY, UserTable.CREDENTIALS, Bytes.toBytes(password)); 
put.add(UserTable.DATA_FAMILY, UserTable.ROLES, Bytes.toBytes(roles)); 
table.put(put); 
table.flushCommits(); 
pool.putTable(table); 

特别注意: HTablePool的getTable方法返回的是HTableInterface接口,这个接口被HTable类实现,这个接口用于与单个Hbase表进行通信。

如果你比较习惯使用HTable与HBase表通信,强制向下转换即可:

HTable table = (HTable)pool.getTable(UserTable.NAME); 
Put put = new Put(Bytes.toBytes(username));
put.add(UserTable.DATA_FAMILY, UserTable.FIRSTNAME,  Bytes.toBytes(firstName));   
put.add(UserTable.DATA_FAMILY, UserTable.LASTNAME,  Bytes.toBytes(lastName));   
put.add(UserTable.DATA_FAMILY, UserTable.EMAIL, Bytes.toBytes(email));
put.add(UserTable.DATA_FAMILY, UserTable.CREDENTIALS, Bytes.toBytes(password)); 
put.add(UserTable.DATA_FAMILY, UserTable.ROLES, Bytes.toBytes(roles)); 
table.put(put); 
table.flushCommits(); 
pool.putTable(table); 

抱歉!评论已关闭.