基于HBase Java API的应用开发

本文介绍通过HBase Java API访问Lindorm宽表引擎的具体操作和使用示例。

前提条件

  • 已安装Java环境,要求安装JDK 1.8及以上版本。

  • 已获取Lindorm宽表引擎中使用HBase Java API访问的连接地址,具体操作请参见查看连接地址

  • 将客户端IP地址添加至云原生多模数据库 Lindorm实例的白名单中,添加方法请参见设置白名单

  • 已完成HBase Java SDK的安装。具体操作请参见安装HBase Java SDK

操作步骤

  1. 通过以下两种方式配置客户端连接Lindorm实例。

    • 在配置文件hbase-site.xml中增加以下配置项。

      <configuration>
            <!--
          集群的连接地址,在控制台页面的数据库连接界面获得(注意公网地址和VPC内网地址)
          -->
          <property>
              <name>hbase.zookeeper.quorum</name>
              <value>ld-xxxx-proxy-hbaseue.lindormue.xxx.rds.aliyuncs.com:30020</value>
          </property>
          <!--
          设置用户名和密码,默认均为root,可根据实际情况调整
          -->
          <property>
              <name>hbase.client.username</name>
              <value>testuser</value>
          </property>
          <property>
              <name>hbase.client.password</name>
              <value>password</value>
          </property>
          </configuration>
    • 在Project中输入下述代码新建Configuration,然后根据下表描述配置相关参数。

      // 新建一个Configuration
      Configuration conf = HBaseConfiguration.create();
      // 集群的连接地址(公网地址)在控制台页面的数据库连接界面获得
      conf.set("hbase.zookeeper.quorum", "host:port");
      // xml_template.comment.hbaseue.username_password.default
      conf.set("hbase.client.username", "用户名");
      conf.set("hbase.client.password", "密码");

      参数

      示例值

      获取方法

      host:port

      ld-bp17j28j2y7pm****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30020

      Lindorm宽表引擎中使用HBase Java API访问的连接地址,具体操作请参见查看连接地址

      用户名

      testuser

      如果您忘记用户名密码,可以通过Lindorm宽表引擎的集群管理系统修改密码,具体操作请参见修改用户密码

      密码

      password

  2. 建立Lindorm客户端和数据之间的连接。

    Connection connection = ConnectionFactory.createConnection(conf);
    说明

    在程序生命周期内只需创建一次,该连接线程安全,可以共享给所有线程使用。在程序结束后,需要将Connection对象关闭,否则会造成连接泄露。也可以采用try finally方式防止泄露。

  3. 连接建立后,可以使用HBase Java API访问Lindorm宽表。下面提供一些简单的Java示例。

    • DDL操作

      try (Admin admin = connection.getAdmin()){
          // 建表
          HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename"));
          htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family")));
          // 创建一个只有一个分区的表
          // 由于单Region会限制集群并行处理能力和负载均衡效果,因此在建表时建议根据数据特点预先分区。所有的数据将存储在同一个分区中,无法实现在多个分区间的并行处理和负载均衡。这可能导致性能瓶颈和数据热点问题。
          admin.createTable(htd);
          // 如果需要创建多个分区的表
          // 示例如下,预分区包含两个分区,分别为: [-∞, 10),[10, ∞), 实际使用时请根据业务情况生成分区信息
          // int numRegions = 2; // 设置需要创建的Region的数量
          // byte[][] splitKeys = new byte[numRegions-1][];
          // for (int i = 1; i < numRegions; i++) {
          //     splitKeys[i-1] = new byte[]{(byte)(i * 10)};
          // }
          // admin.createTable(tableDescriptor, splitKeys);
      
          // disable表
          admin.disableTable(TableName.valueOf("tablename"));
      
          // truncate表,清空表中数据,清空数据前需要先disable表
          admin.truncateTable(TableName.valueOf("tablename"), true);
      
          // 删除表,删除表之前需要先disable表
          admin.deleteTable(TableName.valueOf("tablename"));
      }
    • DML操作

      //Table为非线程安全对象,每个线程在对Table操作时,都必须从Connection中获取相应的Table对象
      try (Table table = connection.getTable(TableName.valueOf("tablename"))) {
          // 插入数据
          Put put = new Put(Bytes.toBytes("row"));
          put.addColumn(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), Bytes.toBytes("value"));
          table.put(put);
      
          // 单行读取
          Get get = new Get(Bytes.toBytes("row"));
          Result res = table.get(get);
      
          // 删除一行数据
          Delete delete = new Delete(Bytes.toBytes("row"));
          table.delete(delete);
      
          // scan 范围数据
          Scan scan = new Scan(Bytes.toBytes("startRow"), Bytes.toBytes("endRow"));
          ResultScanner scanner = table.getScanner(scan);
          for (Result result : scanner) {
              // 处理查询结果result
              // ...
          }
          scanner.close();
      }