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

前提条件

  • 已安装Java SDK,具体操作请参见升级HBase Java SDK
  • 如果应用部署在ECS实例,您需要确保云数据库HBase增强版实例和ECS实例满足以下条件,以保证网络的连通性。ECS实例信息的查看方法请参见查看实例信息
    • 所在地域相同,并建议所在可用区相同(以减少网络延时)。
    • 网络类型相同。
      说明 专有网络具有更高的安全性,建议使用专有网络。如果网络类型为专有网络,需确保使用相同的专有网络ID。
  • 已将ECS实例的IP地址或客户端IP地址添加至云数据库HBase增强版实例的白名单中,具体操作请参见设置白名单

操作步骤

  1. 初始化HBase配置。在Project中输入下述代码,然后根据下表描述配置参数。
    // 新建一个Configuration
    Configuration conf = HBaseConfiguration.create();
    // 集群的连接地址(VPC内网地址)在控制台页面的数据库连接界面获得
    conf.set("hbase.zookeeper.quorum", "ld-bp150tns0sjxs****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020");
    // xml_template.comment.hbaseue.username_password.default
    conf.set("hbase.client.username", "testuser");
    conf.set("hbase.client.password", "password");
    // 如果您直接依赖了阿里云hbase客户端,则无需配置connection.impl参数,如果您依赖了alihbase-connector,则需要配置此参数
    //conf.set("hbase.client.connection.impl", AliHBaseUEClusterConnection.class.getName());
    参数示例值获取方法
    host:portld-bp150tns0sjxs****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020云数据库HBase增强版实例的Java API访问地址的连接地址,可以通过云数据库HBase控制台查看,单击目标实例,左侧导航栏选择数据库连接,在连接信息区域查看Java API访问地址
    用户名testuser如果您忘记用户名密码,可以通过云数据库HBase的集群管理系统修改密码,具体操作请参见管理用户
    密码password
  2. 建立云数据库HBase增强版和数据之间的连接。
    Connection connection = ConnectionFactory.createConnection(conf);
    说明 连接在程序生命周期内只需创建一次,该连接线程安全,可以共享给所有线程使用。在程序结束后,需要将Connection对象关闭,否则会造成连接泄露。也可以采用try finally方式防止泄露。
  3. 建立完连接后,即可使用Java API访问HBase增强版,以下提供简单的Java示例。
    说明 为了兼容HBase 1.x版本的客户端,本示例使用HBase 1.x版本客户端的写法。如果您使用的是HBase 2.x版本的客户端,在某些运行软件中会显示Deprecated,但不会影响正常运行。
    • DDL操作
      try (Admin admin = connection.getAdmin()){
          //建表
          HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename"));
          htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family")));
          //创建一个只有一个分区的表
          //在生产上建表时建议根据数据特点预先分区
          admin.createTable(htd);
            
          //禁用表
          admin.disableTable(TableName.valueOf("tablename"));
            
          //清空表
          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();
      }