你好,游客 登录 注册 搜索
背景:
阅读新闻

[原]hbase编程指南

[日期:2016-03-14] 来源:lujinhong2的博客  作者: [字体: ]

hbase编程指南

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

hbase

完整代码请见:

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);
    }
}




收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款