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!