专栏首页SmartSiHBase Java Admin API

HBase Java Admin API

HBase 使用 Java 语言开发,因而 HBase 原生提供了一个 Java 语言客户端。这篇文章介绍 HBase Admin API,包括创建、启用、禁用、删除表等。如果项目使用 Maven 进行依赖管理,只需添加如下依赖即可以使用 Java 客户端访问 HBase 集群:

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

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-server</artifactId>
    <version>2.1.6</version>
</dependency>

需要注意的是,客户端版本和 HBase 版本需要保持一致,否则可能会遇到不兼容的问题。

如果要是遇到 Protobuf 等类冲突时,可以使用 HBase 提供的一个非常方便的 Jar:

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

<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-shaded-server</artifactId>
  <version>2.1.6</version>
</dependency>

HBASE-13517

hbase-shaded-clienthbase-shaded-server 是在无法以其他方式解决依赖冲突的场景下使用的。在没有冲突的情况下,我们应首选:hbase-clienthbase-server。不要在协处理器内部使用 hbase-shaded-serverhbase-shaded-client,因为这样可能会发生不好的事情。

1. 连接HBase

构建一个 Configuration 示例,该示例包含了一些客户端配置,最重要的必须配置是 HBase 集群的 ZooKeeper 地址与端口。ConnectionFactory 根据 Configuration 示例创建一个 Connection 对象,该 Connection 对象线程安全,封装了连接到 HBase 集群所需要的所有信息,如元数据缓存等。由于 Connection 开销比较大,类似于关系数据库的连接池,因此实际使用中会将该 Connection 缓存起来重复使用:

public class HBaseConn {
    private static final HBaseConn INSTANCE = new HBaseConn();
    private static Configuration config;
    private static Connection conn;

    private HBaseConn() {
        try {
            if (config == null) {
                config = HBaseConfiguration.create();
                config.set("hbase.zookeeper.quorum", "127.0.0.1:2181");
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     */
    private Connection getConnection() {
        if (conn == null || conn.isClosed()) {
            try {
                conn = ConnectionFactory.createConnection(config);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        return conn;
    }

    /**
     * 关闭连接
     */
    private void closeConnection() {
        if (conn != null) {
            try {
                conn.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取连接
     * @return
     */
    public static Connection create() {
        return INSTANCE.getConnection();
    }

    /**
     * 关闭连接
     */
    public static void close() {
        INSTANCE.closeConnection();
    }
}

2. 创建表

可以使用 Admin 类的 createTable() 方法在 HBase 中创建表。此类属于 org.apache.hadoop.hbase.client 包中。Admin 类需要通过 Connection 对象来获取。使用 TableDescriptorBuilder 来构建表名以及列族。然后使用 Admin 类的 createTable() 方法创建表:

public static void create(String name, String... columnFamilies) throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();

    TableName tableName =  TableName.valueOf(name);

    if (admin.tableExists(tableName)) {
        System.out.println("table " + tableName + " already exists");
        return;
    }
    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);
    for (String cf : columnFamilies) {
        builder.setColumnFamily(ColumnFamilyDescriptorBuilder.of(cf));
    }
    admin.createTable(builder.build());
    System.out.println("create table " + tableName + " success");

}

HTableDescriptorHColumnDescriptor 在 2.0.0 版本开始废弃,并在 3.0.0 版本中移除:

HBaseAdmin admin = new HBaseAdmin(conf);
HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf(name));
for (String cf : columnFamilies) {
    tableDescriptor.addFamily(new HColumnDescriptor(cf));
}
admin.createTable(tableDescriptor);

3. 判断表是否存在

要使用 HBase Shell 验证表是否存在,可以使用 exist 命令。同样,使用 Java API,我们可以调用 Admin 类的 tableExists() 方法来验证表是否存在:

public static boolean exists(Admin admin, String name) throws IOException {
    boolean result = admin.tableExists(TableName.valueOf(name));
    return result;
}

4. 禁用表

如果要禁用表,可以使用 Admin 类的 disableTable() 方法。在禁用表之前,我们需要先验证表是否已禁用,可以使用 Admin 类的 isTableDisabled() 方法来验证表是否禁用:

public static void disable(String name) throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();

    TableName tableName = TableName.valueOf(name);

    if (!admin.tableExists(tableName)) {
        System.out.println("table " + tableName + " not exists");
        return;
    }

    boolean isDisabled = admin.isTableDisabled(tableName);
    if (!isDisabled) {
        System.out.println("disable table " + name);
        admin.disableTable(tableName);
    }
}

5. 启用表

如果要启用表,可以使用 Admin 类的 enableTable() 方法。在启用表之前,我们需要先验证表是否已启用,可以使用 Admin 类的 isTableEnabled() 方法来验证表是否启用:

public static void enable(String name) throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();

    TableName tableName = TableName.valueOf(name);

    if (!admin.tableExists(tableName)) {
        System.out.println("table " + tableName + " not exists");
        return;
    }

    boolean isEnabled = admin.isTableEnabled(tableName);
    if (!isEnabled) {
        System.out.println("enable table " + name);
        admin.enableTable(tableName);
    }
}

6. 删除表

如果要删除表,可以使用 Admin 类中的 deleteTable() 方法删除表。在删除表之前,我们需要先验证表是否已被禁用:

public static void delete(String name) throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();

    TableName tableName = TableName.valueOf(name);

    if (!admin.tableExists(tableName)) {
        System.out.println("table " + tableName + " not exists");
        return;
    }

    // 禁用表
    admin.disableTable(tableName);
    // 删除表
    admin.deleteTable(tableName);
    System.out.println("delete table " + name);
}

7. 添加列族

如果添加列族,可以使用 Admin 类的 addColumnFamily() 方法将列族添加到表中。addColumnFamily() 方法需要提供表名以及 ColumnFamilyDescriptor 类对象:

public static void addColumnFamily(String name, String cf) throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();

    TableName tableName =  TableName.valueOf(name);

    if (!admin.tableExists(tableName)) {
        System.out.println("table " + tableName + " not exists");
        return;
    }

    ColumnFamilyDescriptor desc = ColumnFamilyDescriptorBuilder.of(cf);
    admin.addColumnFamily(tableName, desc);
    System.out.println("add column family " + cf);

}

8. 删除列族

如果要删除列族,可以使用 Admin 类的 deleteColumnFamily() 方法将列族从表中删除。deleteColumnFamily() 方法需要提供表名以及 ColumnFamilyDescriptor 类对象:

public static void deleteColumnFamily(String name, String cf) throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();

    TableName tableName =  TableName.valueOf(name);

    if (!admin.tableExists(tableName)) {
        System.out.println("table " + tableName + " not exists");
        return;
    }

    admin.deleteColumnFamily(tableName, cf.getBytes());
    System.out.println("delete column family " + cf);
}

9. 停止

实例化 Admin 类并调用 shutdown() 方法来停止 HBase:

public static void shutdown () throws IOException {
    Connection connection = HBaseConn.create();
    Admin admin = connection.getAdmin();
    admin.shutdown();
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HBase 伪分布式模式安装与启动

    安装 HBase 之前默认我们已经完成了 Hadoop、ZooKeeper 安装,如果还没有安装可以参考如下博文:

    smartsi
  • ElasticSearch 段合并

    由于自动刷新过程每秒会创建一个新的段,这样会导致短时间内段数量暴增。段数目太多会带来比较大的麻烦。每一个段都会消耗文件句柄、内存和 CPU 运行周期。更重要的是...

    smartsi
  • Hive 本地执行模式

    假设你正在运行一些复杂的 Hive 查询,我们都知道这会在后台触发 MapReduce 作业并为你提供输出。如果 Hive 中的数据比较大,这种方法比较有效,但...

    smartsi
  • 给gnuradio安装mediatools模块

    本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/linux-user-groups/

    羽翰尘
  • Java hashCode()与equals()的关联

    一、Hash表数据结构介绍 请参考 哈希表详解 二、equals的内部实现 equals()的定义位于Object.class中: public boo...

    海天一树
  • 分布式监控系统Zabbix3.4-钉钉告警配置记录

    群机器人是钉钉群的高级扩展功能,群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。例如:通过聚合GitHub,GitLab等源码管理服务,实现源...

    洗尽了浮华
  • 三行脚本让 asp.net core 附加进程调试不再头痛

    在将项目升级到 asp.net core 2.2 后,很少使用 IIS Express 运行项目了,基本都是控制台运行或者写个脚本批量启动要运行的接口(多个输出...

    易墨
  • 雪妖现世:给SAP Fiori Launchpad增添雪花纷飞的效果

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    Jerry Wang
  • 基于Simple Image Statistics(简单图像统计,SIS)的图像二值化算法。

      这是个简单的算法,是全局二值算法的一种,算法执行速度快。     算法过程简单描述如下:  对于每一个像素,做如下处理        1、...

    用户1138785
  • 刚毕业去面试Python工程师,这几道题

    docstring是一种文档字符串,用于解释构造的作用。我们在函数、类或方法中将它放在首位来描述其作用。我们用三个单引号或双引号来声明docstring。

    py3study

扫码关注云+社区

领取腾讯云代金券