客户端API是由HTable的实例提供的,用户可以用它来操作HBase表。除了之前提到的一些主要特性外,还有以下一些值得注意的方法。
HTable的实用方法
void close()
用户使用完一个HTable实例之后,需要调用一次Close()。这个方法会刷写所有客户端缓冲的写操作:close()方法会隐式调用flushCache()方法。byte[] getTableName()
这是一个获取表名称的快捷方法。Configuration getConfiguration()
这个方法允许用户访问HTable实例中使用的配置。因为得到的是Configuration实例的引用,所以用户修改的参数都会立即生效HTableDescriptor getTableDescriptor()
每个表都使用一个HTableDescriptor实例来定义自己的表结构用户可以使用这个方法访问这个表的底层结构定义。
static boolean isTableEnabled(table)
HTable类有4个不同的静态辅助方法,它们都需要一个显式的配置和一个表名。如果没有提供显式的配置,方法会找到classpath下的配置文件,使用默认值创建一个隐式的配置。这个方法可以检查表在ZooKeeper中是否被标志为启用。
byte[][] getStartKeys()
byte[][] getEndKeys()
Pair<byte[][],byte[][]>getStartEndKeys()
这些方法让用户可以查看当前表的物理分布情况,不过这个分布很可能在添加一些数据之后发生变化。这些方法返回了表的所有region的起始行键或/和终止行键。它们以二维字节数组形式返回,用户可以使用Bytes.toStringBinary()方法打印这些键。
-void clearRegionCache()
-HRegionLocation getRegionLocation()
-Map<HRegionInfo,HServerAddress> getRegionsInfo()
这些方法可以帮助用户获取某一行数据的具体位置信息,或者说这行数据所在的region信息,以及所有的region的分布信息。用户可以在必要的时候清空缓存的region位置信息。这些方法可以让高级用户了解并使用这些信息,例如控制集群流量或者调整数据的位置。
void prewarmRegionCache(Map<HRegionInfo, HServerAddress> regionMap)
static void setRegionCachePrefetch(table, enable)
static boolean getRegionCachePrefetch(table)
可以先预取region位置信息来避免耗时较多的操作(查找每行数据所属region地址知道本地region地址缓存相对稳定)。使用这些方法,用户可以先获取一个region信息来预热一下region缓存(例如用户可以使用getRegionsInfo()访问这个region的信息表,然后再处理它),用户可以把整张表的预取功能打开。
Bytes类
关于这个类和它的功能还有一些值得一提。
大部分方法都有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()方法存取这种较大的字节数组的数据。
Byte类支持以下原生Java类型到字节数组的互转:String、boolean、short、int、long、double和float。如下表
方法 | 描述 |
---|---|
toStringBinary() | 与toString()方法非常相似,这个方法可以安全地把不能打印的信息转换为人工可读的十六进制数。如果用户不清楚字节数组中的内容,就可以使用这个方法把内容打印出来,比如打印到控制台或日志文件中 |
compareTo()/equals() | 这个方法让用户可以对两个byte[]进行比较。前者返回一个比较结果,后者返回一个布尔值,表示两个数组是否相等 |
add()/head()/tail() | 用这些方法可以把两个字节数组连接在一起形成一个新的数组,或者可以取到字节数组头或尾的一部分 |
binarySearch() | 在用户给定的字节数组中二分查找一个目标值,该方法可以在字节数组上对用户要查找的值和键进行操作 |
incrementBytes() | 一个long类型数据转化成的字节数组与long的数据相加并返回字节数组,用户可以使用负数参数进行减法 |
Bytes类与Java提供的ByteBuffer类的功能有所重叠。不同的是,前者所有的操作都不需要创建一个新的实例。这是考虑到某些情况下的性能优化,因为HBase内部使用了其中许多方法并多次调用,不创建实例也就避免了许多不必要的垃圾回收