hbase编程指南

来源:互联网 发布:人工智能利弊作文 编辑:程序博客网 时间:2024/05/16 06:59

hbase编程指南

  • hbase编程指南
    • 0创建Configuration及Connection对象
    • 1创建及删除表
    • 2插入数据
    • 3读取数据
    • 4扫描表
    • 5更改表结构

本文章参考hbase官方文档的2个示例,整合而成,示范了如何创建表,删除表,更改表结构,还是put, get, scan等操作。

完整代码请见:
https://github.com/lujinhong/hbasedemo/blob/master/src/main/java/com/lujinhong/demo/hbaseDemo/HbaseBasicDemo.java
官方文档请见:
* http://hbase.apache.org/book.html#quickstart
* http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/package-summary.html

0、创建Configuration及Connection对象

在客户端中连接hbase,首先需要2份配置文件,然后,使用配置对象创建一个Connection对象,再使用这个Connection对象来进行各种各样的操作。

private static Connection connection = null;public static Connection getConnection(Configuration config) throws IOException {    if (connection == null) {        connection = ConnectionFactory.createConnection(config);    }    return connection;}public static void main(String[] args) throws IOException {    Configuration config = HBaseConfiguration.create();    config.addResource(new Path("/Users/liaoliuqing/Downloads/conf_loghbase/hbase", "hbase-site.xml"));    config.addResource(new Path("/Users/liaoliuqing/Downloads/conf_loghbase", "core-site.xml"));    try (Connection connection = getConnection(config)) {        createAndDeleteSchemaTables(connection);        putDataToHbase(connection);        getDataFromHbase(connection);        scanTableInHbase(connection);        modifySchema(connection);    }}

以上的几个步骤说明:
(1)创建一个Configuration对象,并加载core-site.xml与hbase-site.xml2个配置文件。也可以不指定路径,但这2个文件必须在CLASSPATH中,因此当你的配置没生效时,检查一下CLASSPATH是不是有其它配置文件。
(2)创建一个Connection对象,这里使用了单例模式,同时使用了AutoClosable的语法,保证connection会被正确close。Connection是有较高的代价的,因此一般情况下保证一个Connection打开即可,如果有多线程同时操作,则使用连接池。

当连接准备好之后,就可以开始各种各样的操作了。

1、创建及删除表

public static void createAndDeleteSchemaTables(Connection connection) throws IOException {    try (Admin admin = connection.getAdmin()) {        HTableDescriptor table = new HTableDescriptor(TableName.valueOf(TABLE_NAME));        table.addFamily(new HColumnDescriptor(FAMILY).setCompressionType(Algorithm.SNAPPY));        System.out.print("Creating table. ");        // 删除表的demo        if (admin.tableExists(table.getTableName())) {            admin.disableTable(table.getTableName());            admin.deleteTable(table.getTableName());        }        admin.createTable(table);        System.out.println(" Done.");    }}

关键步骤为:
(1)获取一个Admin对象,用于管理表。
(2)创建一个HTableDescriptor对象,表示一个表,但这个表还不存在。与下面的Table类对比。
(3)为这个表添加family,及指定压缩格式。
(4)判断表是否已经存在,若存在的话,先disable, 然后delete。
(5)创建表。

Admin, HTableDescriptor对象都是轻量级的,只要有需要就可以创建,
到此,hbase已经多了一个表。

2、插入数据

public static void putDataToHbase(Connection connection) throws IOException {    try(Table table = connection.getTable(TableName.valueOf(TABLE_NAME))){        Put p = new Put(Bytes.toBytes("myLittleRow"));        p.addColumn(Bytes.toBytes(FAMILY), Bytes.toBytes("someQualifier"), Bytes.toBytes("Some Value"));        table.put(p);    }}

(1)使用connection得到一个表对象。
(2)创建一个Put对象,参数为rowKey的字节组。如果不带timestamp参数,则默认使用当前系统时间。
(3)指定这个put的family, qualifier,以及具体的数据。family必须已经存在,而qualifier可以随意。
(4)插入数据
(5)关掉table对象。

3、读取数据

public static void getDataFromHbase(Connection connection) throws IOException {    try (Table table = connection.getTable(TableName.valueOf(TABLE_NAME))) {        Get g = new Get(Bytes.toBytes("myLittleRow"));        Result r = table.get(g);        byte[] value = r.getValue(Bytes.toBytes(FAMILY), Bytes.toBytes("someQualifier"));        // If we convert the value bytes, we should get back 'Some Value',        // the value we inserted at this location.        String valueStr = Bytes.toString(value);        System.out.println("GET: " + valueStr);    }}

(1)创建一个Table对象。
(2)创建一个Get对象,参数是rowKey。
(3)获取result,并提取value
(4)将value打印出来。

4、扫描表

public static void scanTableInHbase(Connection connection) throws IOException {    try (Table table = connection.getTable(TableName.valueOf(TABLE_NAME));) {        Scan s = new Scan();        s.addColumn(Bytes.toBytes(FAMILY), Bytes.toBytes("someQualifier"));        try (ResultScanner scanner = table.getScanner(s);) {            for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {                System.out.println("Found row: " + rr);            }        }    }    // The other approach is to use a foreach loop. Scanners are iterable!    // for (Result rr : scanner) {    // System.out.println("Found row: " + rr);    // }}

(1)创建Table对象
(2)创建Scan对象。
(3)指定family与qualifier。
(4)获取ResultScanner对象。
(5)遍历结果集进行处理。

5、更改表结构

//有问题,而且一般不建议在代码中更改表结构。public static void modifySchema(Connection connection) throws IOException {    try (Admin admin = connection.getAdmin()) {        TableName tableName = TableName.valueOf(TABLE_NAME);        if (!admin.tableExists(tableName)) {            System.out.println("Table does not exist.");            System.exit(-1);        }        HTableDescriptor table = new HTableDescriptor(tableName);        // Update existing table        HColumnDescriptor newColumn = new HColumnDescriptor("NEWCF");        newColumn.setCompactionCompressionType(Algorithm.GZ);        newColumn.setMaxVersions(HConstants.ALL_VERSIONS);        admin.addColumn(tableName, newColumn);        // Update existing column family        HColumnDescriptor existingColumn = new HColumnDescriptor(FAMILY);        existingColumn.setCompactionCompressionType(Algorithm.GZ);        existingColumn.setMaxVersions(HConstants.ALL_VERSIONS);        table.modifyFamily(existingColumn);        admin.modifyTable(tableName, table);        // Disable an existing table        admin.disableTable(tableName);        // Delete an existing column family        admin.deleteColumn(tableName, FAMILY.getBytes("UTF-8"));        // Delete a table (Need to be disabled first)        admin.deleteTable(tableName);    }}
0 0