Java操作HBase的编程实例

HBase常用的Java API

在开始编程之前,我们先来了解一下HBase的一些Java API,与HBase数据存储管理相关的java API主要包括:HBaseConfiguration、Admin、HTableDescriptor、HColumnDescriptor、Put、Get、ResultScanner、Result、Scan。

org.apache.hadoop.hbase.HBaseConfiguration

该类用于管理HBase的配置信息,下面是一些其中的常用方法:

  • Configuration create():使用默认的HBase配置文件创建Configuration

  • Configuration addHbaseResources(Configuration conf):向当前Configuration添加conf中的配置信息

  • Void merge(Configuration destConf, Configuration srcConf):合并个Configuration

org.apache.hadoop.hbase.client.Admin

Admin为Java 接口类型,不可直接用该接口实例化一个对象,而是必须调用Connect.getAdmin()方法返回一个Admin子对象,然后操作里面的对象方法。该接口用于管理HBase数据库的表信息,包括创建表、删除表、列出表项、使表有效或无效、添加或删除表的列族成员、检查HBase的运行状态等。下面是一些其中的常用方法:

  • void addColumn(TableName tableName, ColumnFamilyDescriptor columnFamily):向一个已存在的表中添加列

  • void closeRegion(String regionname, String serverName):关闭Resign

  • void createTable(TableDescriptor desc):创建表

  • void disableTable(TableName tableName):使表无效

  • void deleteTable(TableName tableName):删除表

  • void enableTable(TableName tableName):使表有效

  • Boolean tableExists(TableName tableName):检查表是否存在

  • HTableDescriptor[] listTables():列出所有表

  • void abort(String why, Throwable e):终止服务器或客户端

  • Boolean balancer():负载均衡,返回True或False

org.apache.hadoop.hbase.client.Table

Table为Java 接口类型,不可直接用该接口实例化一个对象,而是必须调用Connect.getTable()方法返回一个Admin子对象,然后操作里面的对象方法。下面是一些其中的常用方法:

  • void close():释放所有资源

  • void delete(Delete delete):删除指定的单元格或行

  • Boolean exists(Get get):检查Get对象指定的列是否存在

  • Result get(Get get):从指定行的单元格中取得相应的值

  • Void put(Put put):向表中添加值

  • ResultScanner getScanner(byte[] family) || ResultScanner getScanner(byte[] family, byte[] qualifier) || ResultScanner getScanner(Scan scan):获得ResultScanner 实例

  • HTableDescriptor getTableDescriptor():获得当前表格的HTableDescriptor对象

  • TableName getName():获取当前表名

org.apache.hadoop.hbase.HTableDescriptor

HTableDescriptor包含了HBase中表格的详细信息,如表的列族、表类型、该表是否可读、MemStore的最大空间、Region什么时候应该分裂等信息。下面是一些其中的常用方法:

  • HTableDescriptor addFamily(HColumnDescriptor family):添加列族

  • Collection getFamilies():返回所有列族的名称

  • TableName getTableName():返回表名实例

  • Byte[] getValue(Bytes key):获得属性值

  • HTableDescriptor removeFamily(byte[] column):删除列族

  • HTableDescriptor setValue(byte[] key, byte[] value):设置属性的值

org.apache.hadoop.hbase.HColumnDescriptor

包含了列族的详细信息,通常在添加列族或创建表时使用。列族一旦建立就不能修改,只能通过删除列族,然后创建新的列族来间接修改。一旦列族被删除,该列族包含的数据也随之删除。下面是一些其中的常用方法:

  • Byte[] getName():获得列族名称

  • Byte[] getValue(byte[] key):获得某列单元格的值

  • HColumnDescriptor setValue(byte[] key, byte[] value):设置某列单元格的值

org.apache.hadoop.hbase.client.Put

用于对单元格执行添加数据。下面是一些其中的常用方法:

  • Put addColumn(byte[] family, byte[] qualifier, byte[] value):将指定的列族、列、值添加到Put对象中

  • List get(byte[] family, byte[] qualifier):获取列族和列中的所有单元格

  • Boolean has(byte[] family, byte[] qualifier):列族和列是否存在

  • Boolean has(byte[] family, byte[] qualifier, byte[] value):检查列族和列中是否存在value

org.apache.hadoop.hbase.client.Get

用来获取单行的信息。下面是一些其中的常用方法:

  • Get addColumn(byte[] family, byte[] qualifier):根据列族和列获取对应的列
  • Get setFilter(Filter filter):通过设置过滤器获取具体的列
org.apache.hadoop.hbase.client.Result

用于存放Get或Put操作后的结果,并以<key,value>的格式存放在map结构中。下面是一些其中的常用方法:

  • Boolean containsColumn(byte[] family, byte[] qualifier):检查是否包含列族和列限定符指定的列

  • List getColumnCells(byte[] family, byte[] qualifier):获得列族和列限定符指定的列中的所有单元格

  • NavigableMap<byte[],byte[]> getFamilyMap(byte[] family):根据列族获得包含列和值的所有行的键值对

  • Byte[] getValue(byte[] family, byte[] qualifier):获得列族和列指定的单元格的最新值

org.apache.hadoop.hbase.ResultScanner

客户端获取值的接口。下面是一些其中的常用方法:

  • Void close():关闭scanner并释放资源

  • Result next():获得下一个Result实例

org.apache.hadoop.hbase.client.Scan

可以利用Scan限定需要查找的数据,如限定版本号、起始行号、终止行号、列族、列名、返回值数量上限等。下面是一些其中的常用方法:

  • Scan addFamily(byte[] family):限定列族

  • public Scan addColumn(byte[] family, byte[] qualifier):限定列族和列

  • public Scan setMaxVersions() || public Scan setMaxVersions(int maxVersions):限定版本的最大个数,如果不带参数调用setMaxVersions(),表示取所有的版本,如果不调用 setMaxVersions(),只会取到最新的版本

  • public Scan setTimeRange(long minStamp, long maxStamp):限定最大最小时间戳范围

  • public Scan setFilter(Filter filter):指定Fileter过滤

  • public Scan setStartRow(byte[] startRow):限定开始的行

  • public Scan setStopRow(byte[] stopRow):限定结束的行(不包含)

  • public Scan setBatch(int batch):限定最多返回的单元格数目

Java操作HBase的编程实例

在编程之前极其重要的一步,就是在使用Java API远程连接HBase时,需要在远程Java API的客户端主机上配置hosts,原因看下图
在这里插入图片描述

下面来结合上面介绍的HBase的Java API,走一个HBase的编程实例,该编程实例创建一个学生信息表student,用来存储学生姓名及考试成绩(学生姓名作为行键,假设学生姓名不会出现重复,考试成绩是一个列族,分别存储了各个科目的考试成绩)。

创立一个Java项目,引入依赖的Jar包(HBase安装目录下的lib目录下的所有jar包和HBase安装目录下的lib目录下的client-facing-thirdparty目录下的所有jar包)。这里采用的是导包的方式创建java工程,如果不想导包的话,可以在maven工程的pom.xml里加入如下依赖(所依赖的jar包要和自己安装的HBase版本对应):

<dependency>
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase-client</artifactId>
	<version>2.1.0</version>
</dependency>

Java代码如下

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.*;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.util.Bytes;
     
    import java.io.IOException;
    public class ExampleForHBase {
        //管理HBase的配置信息
        public static Configuration configuration;
        //管理与HBase的连接
        public static Connection connection;
        //管理HBase数据库的表信息
        public static Admin admin;
        //主函数
        public static void main(String[] args)throws IOException{
            init();
            createTable("student",new String[]{"score"});
            insertData("student","zhangsan","score","English","69");
            insertData("student","zhangsan","score","Math","86");
            insertData("student","zhangsan","score","Computer","77");
            getData("student", "zhangsan", "score","English");
            close();
        }
        //与HBase连接
        public static void init(){
            configuration  = HBaseConfiguration.create();
            configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
            try{
                connection = ConnectionFactory.createConnection(configuration);
                admin = connection.getAdmin();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        //断开连接,先断掉admin,再断开connect
        public static void close(){
            try{
                if(admin != null){
                    admin.close();
                }
                if(null != connection){
                    connection.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        //创建表,传入表名myTableName和列族名colFamily
        public static void createTable(String myTableName,String[] colFamily) throws IOException {
            //设置表名
            TableName tableName = TableName.valueOf(myTableName);
            //判断表是否存在,如果不存在则创建
            if(admin.tableExists(tableName)){
                System.out.println("talbe is exists!");
            }else {
                //HTableDescriptor As of release 2.0.0, this will be removed in HBase 3.0.0
                HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
                for(String str:colFamily){
                    HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
                    hTableDescriptor.addFamily(hColumnDescriptor);
                }
                admin.createTable(hTableDescriptor);
            } 
        }
        //添加数据
        public static void insertData(String tableName,String rowKey,String colFamily,String col,String val) throws IOException { 
            Table table = connection.getTable(TableName.valueOf(tableName));
            Put put = new Put(rowKey.getBytes());
            put.addColumn(colFamily.getBytes(),col.getBytes(), val.getBytes());
            table.put(put);
            table.close(); 
        }
        //浏览数据
        public static void getData(String tableName,String rowKey,String colFamily, String col)throws  IOException{ 
            Table table = connection.getTable(TableName.valueOf(tableName));
            Get get = new Get(rowKey.getBytes());
            get.addColumn(colFamily.getBytes(),col.getBytes());
            Result result = table.get(get);
            System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));
            table.close(); 
        }
    }

代码运行后,控制台显示“69”(就是我们查的zhangsan的英语分数)

在这里插入图片描述

这时,可以到HBase Shell交互式环境中,使用如下命令查看student表是否创建成功

列举hbase中的表

list

成功创建
在这里插入图片描述

查看students表的数据

scan 'student'

可以看到数据已经插入到student表中了
在这里插入图片描述

更详细的编程实例可见:HBase Java API Demo | Github

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值