HBase编程实例

摘要  在前文中安装了Hbase,通过Hbase shell可以进行一些操作,但是和实际的编程实例联系起来不方便,因此本文介绍有关Hbase编程的实例。

摘要:在前文中安装了Hbase,通过Hbase shell可以进行一些操作,但是和实际的编程实例联系起来不方便,因此本文介绍有关Hbase编程的实例。

 

一、使用Eclipse开发HBase应用程序

1,在Eclipse中新建一个Java Project,命名为HBaseTest,然后右键Properties中选择Java Build Path,选择Add External Jars,将HBase/lib目录下的jar包导入进来。

2,在工程根目录下创建Conf文件夹,将HBase/Conf下的hbase-site.xml文件复制到该文件夹中,通过右键选择Properties->Java BuildPath->Libraries->Add Class Folder,然后选择Conf文件夹即可。

 

二、简要介绍HBaseJava API

1,  HbaseConfiguration

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

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

      

2,  HBaseAdmin

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

         作用:提供一个接口来管理HBase数据库中的表信息。它提供创建表、删除表等方法。

 

3,  HTableDescriptor

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

          作用:包含了表的名字及其对应列族。 提供的方法有

        void          addFamily(HColumnDescriptor)          添加一个列族

        HColumnDescriptor   removeFamily(byte[] column)      移除一个列族

        byte[]              getName()                     获取表的名字

        byte[]              getValue(byte[] key)              获取属性的值

        void                setValue(String key,Stringvalue)    设置属性的值

 

4,  HColumnDescriptor

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

        作用:维护关于列的信息。提供的方法有

        byte[]              getName()                   获取列族的名字

        byte[]              getValue()                获取对应的属性的值

        void              setValue(String key,String value)设置对应属性的值

 

5,  HTable

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

作用:用户与HBase表进行通信。此方法对于更新操作来说是非线程安全的,如果启动多个线程尝试与单个HTable实例进行通信,那么写缓冲器可能会崩溃。

 

6,  Put

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

        作用:用于对单个行执行添加操作

7,  Get

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

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

8,  Result

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

        作用:存储Get或Scan操作后获取的单行值。

9,  ResultScanner

        关系:Interface

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

 

三、 HBase Java API简单实例

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import  java.io.IOException;
 
import  org.apache.hadoop.conf.Configuration;
import  org.apache.hadoop.hbase.HBaseConfiguration;
import  org.apache.hadoop.hbase.HColumnDescriptor;
import  org.apache.hadoop.hbase.HTableDescriptor;
import  org.apache.hadoop.hbase.client.HBaseAdmin;
import  org.apache.hadoop.hbase.client.HTable;
import  org.apache.hadoop.hbase.client.Put;
import  org.apache.hadoop.hbase.client.Get;
import  org.apache.hadoop.hbase.client.Result;
import  org.apache.hadoop.hbase.client.ResultScanner;
import  org.apache.hadoop.hbase.client.Scan;
import  org.apache.hadoop.hbase.util.Bytes;
/*
  * @author minglaihan
  */
 
public  class  HBaseTest {
     
     static  Configuration cfg = HBaseConfiguration.create();
     
     //通过HBaseAdmin HTableDescriptor来创建一个新表
     public  static  void  create(String tableName, String columnFamily)  throws  Exception{
         HBaseAdmin admin =  new  HBaseAdmin(cfg);
         if (admin.tableExists(tableName)){
             System.out.println( "Table exist" );
             System.exit( 0 );
         }
         else  {
             HTableDescriptor tableDescriptor =  new  HTableDescriptor(tableName);
             tableDescriptor.addFamily( new  HColumnDescriptor(columnFamily));
             admin.createTable(tableDescriptor);
             System.out.println( "Table create success" );
         }
     }
     
     //添加一条数据,通过HTable Put为已存在的表添加数据
     public  static  void  put(String tableName,String row,String columnFamily,String column,String data)  throws  IOException{
         HTable table =  new  HTable(cfg, tableName);
         Put put =  new  Put(Bytes.toBytes(row));
         put.add(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(data));
         table.put(put);
         System.out.println( "put success" );
     }
     
     //获取tableName表里列为row的结果集
     public  static  void  get(String tableName,String row)  throws  IOException{
         HTable table =  new  HTable(cfg, tableName);
         Get get =  new  Get(Bytes.toBytes(row));
         Result result = table.get(get);
         System.out.println( "get " + result);  
     }
     
     //通过HTable Scan来获取tableName表的所有数据信息
     public  static  void  scan (String tableName)  throws  IOException{
         HTable table =  new  HTable(cfg, tableName);
         Scan scan =  new  Scan();
         ResultScanner resultScanner = table.getScanner(scan);
         for (Result s:resultScanner){
             System.out.println( "Scan " + resultScanner);
         }
     }
     
     public  static  boolean  delete(String tableName)  throws  Exception{
         HBaseAdmin admin =  new  HBaseAdmin(cfg);
         if (admin.tableExists(tableName)){
             try  {
                 admin.disableTable(tableName);
                 admin.deleteTable(tableName);
             catch  (Exception e) {
                 // TODO: handle exception
                 e.printStackTrace();
                 return  false ;
             }
         }
         return  true ;
     }
     
     public  static  void  main(String[] args) {
         String tableName =  "hbase_test" ;
         String columnFamily =  "c1" ;
         
         try  {
             HBaseTest.create(tableName, columnFamily);
             HBaseTest.put(tableName,  "row1" , columnFamily,  "column1" "data1" );
             HBaseTest.get(tableName,  "row1" );
             HBaseTest.scan(tableName);
             if (HBaseTest.delete(tableName)== true ){
                 System.out.println( "delete table " + tableName+ "success" );
             }
             
         catch  (Exception e) {
             // TODO: handle exception
             e.printStackTrace();
         }
     }
}

 

将Delete的步骤注释掉的运行结果截图:

 



 

四、总结

       HBase与Java API的交互目前表现良好,在今后的hadoop编程中,可以根据HBase的情况适当利用,提高整体水平。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值