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数据模型之间的关系。
下面我们将详细讲述这些类的功能,以及它们之间的相互关系。
1.HBaseConfiguration
关系:org.apache.hadoop.hbase.HBaseConfiguration
作用:通过此类可以对HBase进行配置。
包含的主要方法如表12-6所示。
用法示例:
Configuration config=HBaseConfiguration.create();
此方法使用默认的HBase资源来创建Configuration。程序默认会从classpath中查找hbase-site.xml的位置从而初始化Configuration。
2.HBaseAdmin
关系:org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一个接口来管理HBase数据库的表信息。它提供的方法包括创建表、删除表、列出表项、使表有效或无效,以及添加或删除表列族成员等。
包含的主要方法如表12-7所示。
用法示例:
HbaseAdmin admin=new HbaseAdmin(config);
admin.disableTable("tablename");
上述例子通过一个HBaseAdmin实例admin调用disableTable方法来使表处于无效状态。
3.HTableDescriptor
关系:org.apache.hadoop.hbase.HTableDescriptor
作用:HtableDescriptor类包含了表的名字及其对应表的列族。
包含的主要方法如表12-8所示。
用法示例:
HtableDescriptor htd=new HtableDescriptor(tablename);
htd.addFamily(new HcolumnDescriptor("Family"));
在上述例子中,通过一个HColumnDescriptor实例,为HTableDescriptor添加了一个列族:Family。
4.HColumnDescriptor
关系:org.apache.hadoop.hbase.HColumnDescriptor
作用:HColumnDescriptor维护着关于列族的信息,例如版本号、压缩设置等。它通常在创建表或为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重建的方式来“修改”。并且,当列族被删除的时候,对应列族中所保存的数据也将被同时删除。
包含的主要方法如表12-9所示。
用法示例:
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所示。
用法示例:
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所示。
用法示例:
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所示。
用法示例:
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所示。
用法示例:
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所示。
用法示例:
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类。