HBase编程实例

jopen 10年前

在前文中安装了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简单实例

 

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编程实例

HBase编程实例

 

四、总结

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

来自: http://www.ming-yue.cn/hbase-program-examples/