在HBase中,HTable封装表格对象,对表格的增删改查操作主要通过它来完成,构造方法如下:
HTable table=new HTable(config,tableName);
在构建多个HTable对象时,HBase推荐所有的HTable使用同一个Configuration。这样,HTable之间便可共享HConnection对象、zookeeper信息以及Region地址的缓存信息。
用法示例:
返回值 |
函数 |
描述 |
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的使用很简单:
每次进行操作前,通过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);