hbase JavaAPI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hbase JavaAPI相关的知识,希望对你有一定的参考价值。

hbase是Java编写的,当然也提供了Java的API来操作hbase。

如果你是使用虚拟机来安装配置hbase那么你需要配置一下hostname,不然JavaAPI访问虚拟机的时候会无法连接,请参考:

https://www.cnblogs.com/lay2017/p/9953371.html

同时请注意关闭防火墙,如果你的虚拟机启动会默认开启防火墙的话,你需要关闭。

一、依赖

hbase客户端依赖如下:

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

注意:hbase官方版本截止本文已经是2.1.1,但是这里使用1.2.0是由于官方文档并没有及时更新文档,所以对于client的使用你只能看到javadocs很不方便,亦或者你使用它文档的类的时候发现都是deprecated的线。

二、代码示例

以下的代码约200行,但内容并不复杂,仅有以下三块内容

1、在static块里面初始化了hbase的连接

2、main方法里面调用增删改查等JavaAPI接口,各个方法实现相应的内容

3、最后还有一个close方法

我们先看一下输出:

从输出内容我们看到,对表进行了删除、创建、列表查询,然后对表的单元格数据进行了新增、查询、遍历、删除

完整代码如下

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;

import java.io.IOException;
import java.util.Arrays;

/**
 * @Description java api
 * @Author lay
 * @Date 2018/11/12 13:10
 */
public class HbaseJavaApiDemo {

    private static Configuration configuration;
    private static Connection connection;
    private static Admin admin;
    private static final String ENCODE = "UTF-8";

    static {
        // 创建configuration
        configuration = HBaseConfiguration.create();
        // 设置HBase的zk地址和端口
        configuration.set("hbase.zookeeper.quorum", "master");
        configuration.set("hbase.zookeeper.property.clientPort", "2181");
        try {
            connection = ConnectionFactory.createConnection(configuration);
            admin = connection.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        try {
            String table = "t_user";
            String row = "row1";
            String columnFamily = "cf_name";
            String column = "firstName";
            String value = "lay";
            deleteTable(table);
            createOrOverrideTable(table, columnFamily);
            listTables();
            putData(table, row, columnFamily, column, value);
            getData(table, row, columnFamily, column);
            scanData(table);
            deleteData(table, row, columnFamily, column);
        } finally {
            close();
        }
    }

    /**
     * 创建表
     * @param table 表名
     * @param columnFamily 列簇
     * @throws IOException
     */
    public static void createOrOverrideTable(String table, String columnFamily) throws IOException {
        TableName tableName = TableName.valueOf(table);
        HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
        // 添加一个列簇
        HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(columnFamily);
        tableDescriptor.addFamily(hColumnDescriptor);
        // 存在则删除
        deleteTable(table);
        admin.createTable(tableDescriptor);
        System.out.println(table + " 表创建完成");
    }

    /**
     * 列出所有表
     * @throws IOException
     */
    public static void listTables() throws IOException {
        HTableDescriptor[] hTableDescriptors = admin.listTables();
        System.out.println("列出所有的表:");
        for (HTableDescriptor t : hTableDescriptors) {
            System.out.println(t.getTableName());
        }
    }

    /**
     * 删除表
     * @param table 表名
     * @throws IOException
     */
    public static void deleteTable(String table) throws IOException {
        TableName tableName = TableName.valueOf(table);
        if (admin.tableExists(tableName)) {
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
            System.out.println(table + " 存在并执行删除");
        }
    }

    /**
     * 添加数据
     * @param table 表名
     * @param row 行
     * @param columnFamily 列簇
     * @param column 列
     * @param value 值
     * @throws IOException
     */
    public static void putData(String table, String row, String columnFamily, String column, String value) throws IOException {
        TableName tableName = TableName.valueOf(table);
        Put put = new Put(row.getBytes(ENCODE));
        put.addColumn(columnFamily.getBytes(ENCODE), column.getBytes(ENCODE), value.getBytes(ENCODE));
        Table iTable = connection.getTable(tableName);
        iTable.put(put);
        iTable.close();
        System.out.println("数据添加完毕");
    }

    /**
     * 查询数据
     * @param table
     * @param row
     * @param columnFamily
     * @param column
     * @throws IOException
     */
    public static void getData(String table, String row, String columnFamily, String column) throws IOException {
        TableName tableName = TableName.valueOf(table);
        Get get = new Get(row.getBytes(ENCODE));
        Table iTable = connection.getTable(tableName);
        Result result = iTable.get(get);
        byte[] data = result.getValue(columnFamily.getBytes(ENCODE), column.getBytes(ENCODE));
        System.out.println("查询的数据:" + new String(data));
        iTable.close();
    }

    /**
     * 删除数据
     * @param table
     * @param row
     * @param columnFamily
     * @param column
     * @throws IOException
     */
    public static void deleteData(String table, String row, String columnFamily, String column) throws IOException {
        TableName tableName = TableName.valueOf(table);
        Delete delete = new Delete(row.getBytes(ENCODE));
        delete.addColumn(columnFamily.getBytes(ENCODE), column.getBytes(ENCODE));
        Table iTable = connection.getTable(tableName);
        iTable.delete(delete);
        iTable.close();
        System.out.println("数据删除完毕");
    }

    /**
     * 扫描数据
     * @param table
     * @throws IOException
     */
    public static void scanData(String table) throws IOException {
        TableName tableName = TableName.valueOf(table);
        Scan scan = new Scan();
        Table iTable = connection.getTable(tableName);
        ResultScanner resultScanner = iTable.getScanner(scan);
        for (Result r : resultScanner) {
            Cell[] cells = r.rawCells();
            System.out.println("遍历的数据结果:");
            Arrays.stream(cells).forEach(cell -> {
                String value = new String(CellUtil.cloneValue(cell));
                System.out.println(value);
            });
        }
        iTable.close();
    }

    /**
     * 关闭admin和connection
     */
    public static void close() {
        if (admin != null) {
            try {
                admin.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

}

 

以上是关于hbase JavaAPI的主要内容,如果未能解决你的问题,请参考以下文章

HBase单节点下JavaAPI连接

Hbase-1.2.4 javaAPI实现简单的类CRUD操作

HBase JavaAPI

HBase的JavaAPI

Hbase JavaApi

hbase JavaAPI