(三)实战2:hbase的1.X版本java APIjava开发实例

hbase的java开发实例

参考

1:hbase的代码编写思路:

1、准备连接hbase集群的配置信息
	zookeeper的位置
	HBaseConfiguration

2、根据连接信息获取连接对象
Connection

3、根据连接对象获取操作对象
coon.get
	有两大类:
	DDL :	Admin 负责表对象的创建删除
	DML :	Table 负责内容的增删改查

Admin 和Table 线程不安全,每个线程应该有自己的变量
4、根据你要做的操作,拿到操作对象,调用这个对象中的对应方法进行实际操作
admin.createTable()
table.
get(Get get)
put(Put put)
delete(Delete delete)
getScanner(Scan scan)
5、处理结果
重点关注:查询
get: Result(hbase表中的一条记录,是由这个记录rowkey中所管理的所有的key-value的集合)
scan: ResultScanner(这个对象,其实就是Result对象的一个集合)
一个key-value对象的抽象:
KeyValue、Cell

6、关闭连接,回收资源

**代码编写过程中,肯定会涉及到要去指定表的定义和列簇的定义**

create "student", "cf1", "cf2"
create "student", {NAME => "cf1", VERSION => 4}

admin.createTable(表定义,列簇定义)
	表定义:HTableDescriptor
	列簇定义: HColumnDescriptor(列簇和列)

2 开发准备

同样将集群的hdfs-site.xml和core-site.xml放到resource下

// 声明静态配置

public class hbaseUseJavaAPI {
    //Jhbase的java开发实例介绍
    // 声明静态配置

    private static Configuration conf = null;
    private static final String ZK_CONNECT_STR =
            "hdp01:2181,hdp02:2181,hdp03:2181";

    static {
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", ZK_CONNECT_STR);
    }

引入maven依赖
此处采用1.2版本的依赖,2.x系列依赖开发有一些不同

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

2.1:初始化连接

一般采用单例模式或静态代码块创建唯一的Connection

 private static Connection connection;
    static {
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.property.clientPort", "2181");
        // 如果是集群 则主机名用逗号分隔
        configuration.set("hbase.zookeeper.quorum", "hadoop001");
        try {
            connection = ConnectionFactory.createConnection(configuration);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.2:创建表

shell命令:
创建一张 hbase 表,表名叫做 user,该表有 info 和 data 两个列簇
create 'user', 'info', 'data' 

api开发和shell基本类似


    public static void creatTable(String name, String[] family, Admin admin) {
        //传递表名
        TableName tableName = TableName.valueOf(name);
        //创建表的描述对象,对列簇,操作
        HTableDescriptor desc = new HTableDescriptor(tableName);
        HColumnDescriptor columnDescriptor = null;
        for (int i = 0; i < family.length; i++) {
            //列簇的描述对象HColumnDescriptor:传递列簇
            columnDescriptor = new HColumnDescriptor(family[i]);
            //添加列簇
            desc.addFamily(columnDescriptor);
            //移除列簇
            // desc.remove("result");
        }
        try {
            if (admin.tableExists(tableName)) {
                System.out.println("table Exists!");
                // admin.close();
            } else {
                admin.createTable(desc);

                System.out.println("create table Success!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

创建结果

结果:
create table Success!
hbase shell进入hbase数据库
list可查看到创建成功

2.3:put数据到hbase

shell命令:
put要指定rowkey
向 user 表中插入信息,row key 为 rk0001,列簇 info 中添加 name 列标示符,值为 zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
 private static void put(String name, Connection connection) {

        Table table = null;
        TableName tableName = TableName.valueOf(name);
        try {
            table = connection.getTable(tableName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        HashMap<String, Integer> map = new HashMap<>();
        map.put("age", 15);
        map.put("age", 18);
        Iterator<String> iterator = map.keySet().iterator();
        Put put = null;
        while (iterator.hasNext()) {
            String age = iterator.next();
            Integer value = map.get(age);
            //指定rowkey
            put = new Put("001".getBytes());
            //指定列簇,列,值
            put.addColumn("info".getBytes(), age.getBytes(), value.toString().getBytes());

        }
        put.addColumn("info".getBytes(), "name".getBytes(), "dj".getBytes());
        put.addColumn("info".getBytes(), "name".getBytes(), "xm".getBytes());
        try {
            table.put(put);
            System.out.println("put message to hbase success");
        } catch (IOException e) {
            System.out.println("put message to hbase exception");
        }

    }

2.4:从hbase去get数据

shell命令
get必须指定rowkey
获取 user 表中 row key 为 rk0001,info 列簇的所有信息
get 'user', 'rk0001', 'info'
 private static void get(String name, Connection connection) {
        Table table = null;
        Result result = null;
        TableName tableName = TableName.valueOf(name);
        try {
            table = connection.getTable(tableName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //通过Get对象,指定rowkey,默认查询这个rowkey的所有数据
        Get get = new Get(Bytes.toBytes("001"));
        //限制只查询f1列族下面所有列的值
        get.addFamily("info".getBytes());

        //执行get查询,返回一个result对象,所有rowkey为001的单元格的所有信息都会都封装在这个对象中
        try {
            result = table.get(get);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //将每个单元格的所有信息封装在cell对象内,再放入集合中
        List<Cell> cells = result.listCells();
        //遍历cells, 看cell中封装了哪些信息
        System.out.println("get message from hbase");
        for (Cell cell : cells) {
            byte[] value = CellUtil.cloneValue(cell);//获取单元格的值
            byte[] rowkey = CellUtil.cloneRow(cell);//获取单元格对应的rowkey
            byte[] columnName = CellUtil.cloneQualifier(cell);//获取单元格所属的列名
            byte[] familyName = CellUtil.cloneFamily(cell);//获取单元格所属的列族名

            System.out.println("列簇: " + Bytes.toString(familyName));
            System.out.println("列: " + Bytes.toString(columnName));
            System.out.println("rowkey: " + Bytes.toString(rowkey));
            System.out.println("值: " + Bytes.toString(value));
        }
    }

2.5:scan 扫描数据

shell:
查询表名为user_info表中列簇为base_info,rowkey的起始偏移范围是[baiyc_20150716_0003,
baiyc_20150716_0006)的数据
scan 'user_info', {COLUMNS => 'base_info', STARTROW => 'baiyc_20150716_0003', ENDROW => 
'baiyc_20150716_0006'}
 private static void scan(String name, Connection connection) {

        Table table = null;
        TableName tableName = TableName.valueOf(name);
        try {
            table = connection.getTable(tableName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Scan scan = new Scan();//默认会全表扫描,所有下面要添加约束
        ResultScanner scanner = null;
        try {
            //进行全表扫描
            scanner = table.getScanner(scan);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //遍历ResultScanner 得到每一条数据,每一条数据都是封装在result对象里面了
        for (Result results : scanner) {
            //每一条数据
            List<Cell> cells = results.listCells();
            System.out.println("scan 全表扫描");
            for (Cell cell : cells) {
                byte[] familyName = CellUtil.cloneFamily(cell);
                byte[] qualifierName = CellUtil.cloneQualifier(cell);
                byte[] rowkey = CellUtil.cloneRow(cell);
                byte[] valueArr = CellUtil.cloneValue(cell);

               /* if ("name".equals(Bytes.toString(qualifierName)) || "age".equals(Bytes.toString(qualifierName))) {
                    int value = Bytes.toInt(valueArr);
                    System.out.println(Bytes.toString(familyName) + "\t"
                            + Bytes.toString(qualifierName) + "\t"
                            + Bytes.toString(rowkey) + "\t"
                            + value);
                } else {*/
                    String value = Bytes.toString(valueArr);
                    System.out.println(Bytes.toString(familyName) + "\t"
                            + Bytes.toString(qualifierName) + "\t"
                            + Bytes.toString(rowkey) + "\t"
                            + value);
            }
        }
    }

2.6释放资源

private static void close(Connection connection, Admin admin) {
        try {
            connection.close();
            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值