本文介绍如何通过HBase Java API 访问云数据库HBase增强版集群。

前提条件

  • 已安装Java SDK,请参考HBase Java SDK 下载
  • 通过内网连接时,请确认已购买与HBase增强版在相同专有网络VPC的ECS服务器,并将ECS服务器的IP地址在HBase中添加为白名单。
  • 通过外网连接时,若未配置白名单请参考:设置白名单
  1. 拷贝客户端连接配置。
    1. 登录云数据库HBase控制台
    2. 集群列表页,单击集群实例名称,进入集群详情页。
      集群列表
    3. 集群详情页,单击数据库连接,进入数据库连接页。
    4. 单击一键生成配置项,生成客户端连接配置,拷贝Java配置页签下的Java代码。
      Java配置
  2. 初始化HBase配置,添加拷贝的JAVA配置代码。
    // 新建一个Configuration
    Configuration conf = HBaseConfiguration.create();
    // 集群的连接地址,在控制台页面的数据库连接界面获得(注意公网地址和VPC内网地址)
    conf.set("hbase.zookeeper.quorum", "ld-xxxx-proxy-hbaseue.hbaseue.xxx.rds.aliyuncs.com:30020");
    // 设置用户名密码,默认root:root,可根据实际情况调整
    conf.set("hbase.client.username", "root")
    conf.set("hbase.client.password", "root")
    
    // 如果您直接依赖了阿里云hbase客户端,则无需配置connection.impl参数,如果您依赖了alihbase-connector,则需要配置此参数
    //conf.set("hbase.client.connection.impl", AliHBaseUEClusterConnection.class.getName());
    说明 如果您依赖了老版本的alihbase-connector(版本号小于1.0.9/2.0.9,请参考 参数配置)。
  3. 创建HBase 连接。

    在客户本地的业务代码中通过配置Configuration创建Connection。

    // 创建 HBase连接,在程序生命周期内只需创建一次,该连接线程安全,可以共享给所有线程使用。
    // 在程序结束后,需要将Connection对象关闭,否则会造成连接泄露。
    // 也可以采用try finally方式防止泄露
    Connection connection = ConnectionFactory.createConnection(conf);
  4. 建立完连接后,即可使用Java API访问HBase增强版集群,以下提供简单的Java 示例。
    • DDL操作
      try (Admin admin = connection.getAdmin()){
          // 建表
          HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename"));
          htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family")));
          // 创建一个只有一个分区的表
          // 在生产上建表时建议根据数据特点预先分区
          admin.createTable(htd);
            
          // disable 表
          admin.disableTable(TableName.valueOf("tablename"));
            
          // truncate 表
          admin.truncateTable(TableName.valueOf("tablename"), true);
            
          // 删除表
          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();
      }