本节书摘来异步社区《HBase权威指南》一书中的第3章,第3.6节,作者: 【美】Lars George 译者: 代志远 , 刘佳 , 蒋杰 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.6 各种特性
在深入介绍客户端可以利用的特性之前,让我们先介绍一下HBase和其客户端API提供的各种特性或功能。
3.6.1 HTable的实用方法
客户端API是由HTable类的实例提供的,用户可以用它来操作HBase表。除了之前提到过的一些主要特性外,还有以下一些值得注意的方法。
void close()
这个方法之前提到过,不过为了它的完整性和重要性,我们在这儿要重新讨论一下。用户使用完一个HTable实例之后,需要调用一次close()。这个方法会刷写所有客户端缓冲的写操作:close()方法会隐式调用flushCache()方法。
byte[] getTableName()
这是一个获取表名称的快捷方法。
Configuration getConfiguration()
这个方法允许用户访问HTable实例中使用的配置。因为得到的是Configuration实例的引用,所以用户修改的参数(针对客户端的)都会立即生效。
HTableDescriptor getTableDescriptor()
这个方法会在5.1.1节进行详细介绍,每个表都使用一个HTableDescriptor实例来定义自己的表结构。用户可以使用这个方法访问这个表的底层结构定义。
static boolean isTableEnabled(table)
HTable类有4个不同的静态辅助方法,它们都需要一个显式的配置和一个表名。如果没有提供显式的配置,方法会找到classpath下的配置文件,使用默认值创建一个隐式的配置。这个方法可以检查表在ZooKeeper中是否被标志为启用。
byte[][] getStartKeys()
byte[][] getEndKeys()
Pair< byte[][], byte[][]> getStartEndKeys()
这些方法让用户可以查看当前表的物理分布情况,不过这个分布很可能在添加一些数据之后发生变化。这些方法返回了表的所有region的起始行键或/和终止行键。它们以二维字节数组形式返回,用户可以使用Bytes.toStringBinary()方法打印这些键。
void clearRegionCache()
HRegionLocation getRegionLocation(row)
Map< HRegionInfo, HServerAddress> getRegionsInfo()
这些方法可以帮助用户获取某一行数据的具体位置信息,或者说这行数据所在的region信息,以及所有region的分布信息。用户也可以在必要的时候清空缓存的region位置信息。这些方法可以让高级用户了解并使用这些信息,例如,控制集群流量或者调整数据的位置。
void prewarmRegionCache(Map< HRegionInfo, HServerAddress> regionMap)
static void setRegionCachePrefetch(table, enable)
static boolean getRegionCachePrefetch(table)
这又是一组高级方法。在1.4.5节提到过,可以先预取region位置信息来避免耗时较多的操作(查找每行数据所属region地址直到本地region地址缓存相对稳定)。使用这些方法,用户可以先获取一个region的信息表来预热一下region缓存(例如,用户可以使用getRegionsInfo()访问这个region的信息表,然后再处理它),也可以把整张表的预取功能打开。
3.6.2 Bytes类
前面介绍过,如何使用这个类转化Java的数据类型,例如,将String或long转化为HBase原生支持的原始字节数组。关于这个类和它的功能还有一些值得一提。
大部分方法都有3种形式,例如:
static long toLong(byte[] bytes)
static long toLong(byte[] bytes,int offset)
static long toLong(byte[] bytes,int offset,int length)
用户可以输入一个字节数组,或者一个字节数组再加一个偏移值,或者一个字节数组、一个偏移值和一个长度值。具体使用哪一种方法取决于最初这个字节数组是怎么生成的。如果这个字节数组之前是由toBytes()方法生成的,用户就可以安全地使用第一种形式的方法将其转化回来,只需送入这个字节数组而不需要其他额外信息。整个数组的内容都是转换过来的值。
不过,API和HBase内部都把数据存储为一个较大的数组,例如,使用下面的方法:
static int putLong(byte[] bytes,int offset,long val)
这个方法允许用户把一个long值写入一个字节数组的特定偏移位置。用户可以使用后面的两种toLong()方法存取这种较大的字节数组的数据。
Bytes类支持以下原生Java类型到字节数组的互转:String、boolean、short、int、long、double和float。除了之前介绍的方法外,还有一些值得一提的方法列举在表3-10中。
完整的文档请参阅基于JavaDoc的API文档⑨。
①region服务器采用了一种多版本并发控制机制,具体实现在ReadWriteConsistencyControl(简称为RWCC)类中。这种机制保证了读程序读取数据时可以不用等待写程序完成写操作。写程序则需要等待其他写程序完成写操作之后才能继续执行。
②全局唯一标识符(Universally Unique Identifier)细节请参阅http://en.wikipedia.org/wiki/Universally_unique_identifier。
③见维基百科的“Unix time”(http://en.wikipedia.org/wiki/Unix_epoch)。
④完整的描述请参阅API文档中KeyValue类的介绍(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/KeyValue.html)。
⑤参见维基百科的“Remote procedure call”(http://en.wikipedia.org/wiki/Remote_procedure_call)。
⑥为了方便阅读,相关细节被分为多组,组之间用空行隔开。
⑦见链接http://en.wikipedia.org/wiki/Multiversion_concurrency_control。
⑧扫描操作与不可回滚的游标操作相似。用户需要先声明,然后打开,并获取数据,最后关闭数据库游标。不过扫描操作没有声明这一步,否则扫描操作和游标操作的使用方法就是一样的了。参见维基百科中的Cursors。
⑨参阅在线文档Bytes一节(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes/html)。