《HBase权威指南》一3.6 各种特性

本节书摘来异步社区《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中。


b10


完整的文档请参阅基于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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值