12.9.2 HBase编程
在12.8节中,我们已经对常用的HBase API进行了简单的介绍。下面我们给出一个简单的例子,希望大家通过学习这个例子能对HBase的使用方法及特点有一个更深入的认识。示例代码如代码清单12-2所示。
代码清单12-2 HBase Java API简单用例
1 package cn.edn.ruc.clodcomputing.book.chapter12;
2
3 import java.io.IOException;
4
5 import org.apache.hadoop.conf.Configuration;
6 import org.apache.hadoop.hbase.HBaseConfiguration;
7 import org.apache.hadoop.hbase.HColumnDescriptor;
8 import org.apache.hadoop.hbase.HTableDescriptor;
9 import org.apache.hadoop.hbase.client.Get;
10 import org.apache.hadoop.hbase.client.HBaseAdmin;
11 import org.apache.hadoop.hbase.client.HTable;
12 import org.apache.hadoop.hbase.client.Put;
13 import org.apache.hadoop.hbase.client.Result;
14 import org.apache.hadoop.hbase.client.ResultScanner;
15 import org.apache.hadoop.hbase.client.Scan;
16 import org.apache.hadoop.hbase.util.Bytes;
17
18
19 public class HBaseTestCase{
20//声明静态配置HBaseConfiguration
21 static Configuration cfg=HBaseConfiguration.create();
22
23//创建一张表,通过HBaseAdmin HTableDescriptor来创建
24 public static void creat(String tablename, String columnFamily)throws
Exception{
25 HBaseAdmin admin=new HBaseAdmin(cfg);
26 if(admin.tableExists(tablename)){
27 System.out.println("table Exists!");
28 System.exit(0);
29}
30 else{
31 HTableDescriptor tableDesc=new HTableDescriptor(tablename);
32 tableDesc.addFamily(new HColumnDescriptor(columnFamily));
33 admin.createTable(tableDesc);
34 System.out.println("create table success!");
35}
36}
37
38//添加一条数据,通过HTable Put为已经存在的表来添加数据
39 public static void put(String tablename, String row, String columnFamily,
String column, String data)throws Exception{
40 HTable table=new HTable(cfg, tablename);
41 Put p1=new Put(Bytes.toBytes(row));
42 p1.add(Bytes.toBytes(columnFamily),Bytes.toBytes(column),
Bytes.toBytes(data));
43 table.put(p1);
44 System.out.println("put'"+row+"','"+columnFamily+":"+column+"',
'"+data+"'");
45}
46
47 public static void get(String tablename, String row)throws IOException{
48 HTable table=new HTable(cfg, tablename);
49 Get g=new Get(Bytes.toBytes(row));
50 Result result=table.get(g);
51 System.out.println("Get:"+result);
52}
53//显示所有数据,通过HTable Scan来获取已有表的信息
54 public static void scan(String tablename)throws Exception{
55 HTable table=new HTable(cfg, tablename);
56 Scan s=new Scan();
57 ResultScanner rs=table.getScanner(s);
58 for(Result r:rs){
59 System.out.println("Scan:"+r);
60}
61}
62
63 public static boolean delete(String tablename)throws IOException{
64
65 HBaseAdmin admin=new HBaseAdmin(cfg);
66 if(admin.tableExists(tablename)){
67 try
68{
69 admin.disableTable(tablename);
70 admin.deleteTable(tablename);
71}catch(Exception ex){
72 ex.printStackTrace();
73 return false;
74}
75
76}
77 return true;
78}
79
80 public static void main(String[]agrs){
81 String tablename="hbase_tb";
82 String columnFamily="cf";
83
84 try{
85 HBaseTestCase.creat(tablename, columnFamily);
86 HBaseTestCase.put(tablename,"row1",columnFamily,"cl1","data");
87 HBaseTestCase.get(tablename,"row1");
88 HBaseTestCase.scan(tablename);
89 if(true==HBaseTestCase.delete(tablename))
90 System.out.println("Delete table:"+tablename+"success!");
91
92}
93 catch(Exception e){
94 e.printStackTrace();
95}
96}
97}
在该类中,实现了类似HBase Shell的表创建(creat(String tablename, String columnFamily))操作,以及Put、Get、Scan和delete操作。
在代码清单12-2中,首先,通过第21行加载HBase的默认配置cfg;然后,通过HbaseAdmin接口来管理现有数据库,见第25行;第26~36行通过HTableDescriptor(指定表相关信息)和HColumnDescriptor(指定表内列族相关信息)来创建一个HBase数据库,并设置其拥有的列族成员;put函数通过HTable和Put类为该表添加值,见第38~44行;get函数通过HTable和Get读取刚刚添加的值,见第47~52行;Scan函数通过HTable和Scan类读取表中的所有记录,见第54~61行;delete函数,通过HBaseAdmin首先将表置为无效(第69行),然后将其删除(第70行)。
该程序在Eclipse中的运行结果如下所示:
……
create table success!
put'row1','cf:cl1','data'
Get:keyvalues={row1/cf:cl1/1336632861769/Put/vlen=4}
Scan:keyvalues={row1/cf:cl1/1336632861769/Put/vlen=4}
……
12/05/09 23:54:21 INFO client.HBaseAdmin:Started disable of hbase_tb
12/05/09 23:54:23 INFO client.HBaseAdmin:Disabled hbase_tb
12/05/09 23:54:24 INFO client.HBaseAdmin:Deleted hbase_tb
Delete table:hbase_tb success!