HBase编程实例

来源:互联网 发布:java中异步请求 编辑:程序博客网 时间:2024/06/06 03:56
摘要 在前文中安装了Hbase,通过Hbase shell可以进行一些操作,但是和实际的编程实例联系起来不方便,因此本文介绍有关Hbase编程的实例。

目录[-]

  • 一、使用Eclipse开发HBase应用程序
  • 二、简要介绍HBaseJava API
  • 三、 HBase Java API简单实例
  • 四、总结
  • 摘要:在前文中安装了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的情况适当利用,提高整体水平。

    0 0