12.8 Java API

通过前面的内容读者已经了解到,HBase作为云环境中的数据库,与传统数据库相比拥有不同的特点。当前HBase的Java API已经比较完善了,从其涉及的内容来讲,大体包括:HBase自身的配置管理部分、Avro部分、HBase客户端部分、MapReduce部分、Rest部分、Thrift部分,ZooKeeper等。其中HBase自身的配置管理部分又包括:HBase配置、日志、IO、Master、Regionserver、replication,以及安全性。

限于篇幅我们重点介绍与HBase数据存储管理相关的内容,其涉及的主要类包括:HBaseAdmin、HBaseConfiguration、HTable、HTableDescriptor、HColumnDescriptor、Put、Get和Scanner。关于Java API的详细内容,大家可以查看HBase官方网站的相关资料:http://hbase.apache.org/apidocs/index.html。

表12-5给我们描述了这几个相关类与对应的HBase数据模型之间的关系。

12.8 Java API - 图1

下面我们将详细讲述这些类的功能,以及它们之间的相互关系。

1.HBaseConfiguration

关系:org.apache.hadoop.hbase.HBaseConfiguration

作用:通过此类可以对HBase进行配置。

包含的主要方法如表12-6所示。

12.8 Java API - 图2

用法示例:


Configuration config=HBaseConfiguration.create();


此方法使用默认的HBase资源来创建Configuration。程序默认会从classpath中查找hbase-site.xml的位置从而初始化Configuration。

2.HBaseAdmin

关系:org.apache.hadoop.hbase.client.HBaseAdmin

作用:提供了一个接口来管理HBase数据库的表信息。它提供的方法包括创建表、删除表、列出表项、使表有效或无效,以及添加或删除表列族成员等。

包含的主要方法如表12-7所示。

12.8 Java API - 图3

用法示例:


HbaseAdmin admin=new HbaseAdmin(config);

admin.disableTable("tablename");


上述例子通过一个HBaseAdmin实例admin调用disableTable方法来使表处于无效状态。

3.HTableDescriptor

关系:org.apache.hadoop.hbase.HTableDescriptor

作用:HtableDescriptor类包含了表的名字及其对应表的列族。

包含的主要方法如表12-8所示。

12.8 Java API - 图4

用法示例:


HtableDescriptor htd=new HtableDescriptor(tablename);

htd.addFamily(new HcolumnDescriptor("Family"));


在上述例子中,通过一个HColumnDescriptor实例,为HTableDescriptor添加了一个列族:Family。

4.HColumnDescriptor

关系:org.apache.hadoop.hbase.HColumnDescriptor

作用:HColumnDescriptor维护着关于列族的信息,例如版本号、压缩设置等。它通常在创建表或为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重建的方式来“修改”。并且,当列族被删除的时候,对应列族中所保存的数据也将被同时删除。

包含的主要方法如表12-9所示。

12.8 Java API - 图5

用法示例:


HtableDescriptor htd=new HtableDescriptor(tablename);

HcolumnDescriptor col=new HcolumnDescriptor("content");

htd.addFamily(col);


此示例添加了一个名为content的列族。

5.HTable

关系:org.apache.hadoop.hbase.client.HTable

作用:此表可以用来与HBase表进行通信。这个方法对于更新操作来说是非线程安全的,也就是说,如果有过多的线程尝试与单个HTable实例进行通信,那么写缓冲器可能会崩溃。这时,建议使用HTablePool类进行操作。

该类所包含的主要方法如表12-10所示。

12.8 Java API - 图6

用法示例:


Htable table=new Htable(conf, Bytes.toBytes(tablename));

ResultScanner scanner=table.getScanner(Bytes.toBytes(“cf”));


上述函数将获取表内所有列族为“cf”的记录。

6.Put

关系:org.apache.hadoop.hbase.client.Put

作用:用来对单个行执行添加操作。

包含的主要方法如表12-11所示。

12.8 Java API - 图7

用法示例:


HTable table=new HTable(conf, Bytes.toBytes(tablename));

Put p=new Put(row);//为指定行(row)创建一个Put操作

p.add(family, qualifier, value);

table.put(p);


上述函数将向表“tablename”添加“family, qualifier, value”指定的值。

7.Get

关系:org.apache.hadoop.hbase.client.Get

作用:用来获取单个行的相关信息。

包含的主要方法如表12-12所示。

12.8 Java API - 图8

用法示例:


Htable table=new Htable(conf, Bytes.toBytes(tablename));

Get g=new Get(Bytes.toBytes(row));

Result result=table.get(g);


上述函数将获取“tablename”表中“row”行对应的记录。

8.Result

关系:org.apache.hadoop.hbase.client.Result

作用:存储Get或Scan操作后获取的表的单行值。使用此类提供的方法能够直接方便地获取值或获取各种Map结构(<key, value>对)。

包含的主要方法如表12-13所示。

12.8 Java API - 图9

用法示例:


HTable table=new HTable(conf, Bytes.toBytes(tablename));

Get g=new Get(Bytes.toBytes(row));

Result rowResult=table.get(g);

Bytes[]value=rowResult.getValue((family+":"+column));


9.ResultScanner

关系:Interface

作用:客户端获取值的接口。

包含的主要方法如表12-14所示。

12.8 Java API - 图10

用法示例:


ResultScanner scanner=table.getScanner(Bytes.toBytes(family));

for(Result rowResult:scanner){

Bytes[]str=rowResult.getValue(family, column);

}


如果大家想要对HBase的原理、运行机制以及编程有更深入的了解,建议阅读HBase的源码。通过对HBase源码的深入探究,相信大家一定能够对HBase有更深层次的理解。

[1]org.apache.hadoop.hbase.client.Get类。

[2]org.apache.hadoop.hbase.client.Put类。