本文介紹通過配置HBase Java API訪問云數據庫HBase Serverless集群。

前提條件

  • 已安裝Java SDK,請參考HBase Java SDK 下載
  • 通過內網連接時,請確認已購買與HBase Serverless版集群在相同專有網絡VPC下的ECS服務器,若未購買ECS服務器,購買方式請參見:如何創建ECS實例
    說明 目前HBase Serverless不支持新購。

注意事項

HBase Serverless版僅支持使用HBase-1.x和HBase-2.x版本客戶端進行訪問,同時需要依賴訪問插件alihbase-connector,以支持安全認證、公網訪問等能力。

操作步驟

  1. 獲取AccessKey_ID和AccessKey_Secret,請參見獲取并使用Serverless HBase用戶名和密碼
  2. 初始化HBase配置文件。
    // 新建一個Configuration
    Configuration conf = HBaseConfiguration.create();
    // 實例訪問地址
    conf.set("hbase.zookeeper.quorum", "https://sh-****-hbase-serverless.hbase.rds.aliyuncs.com:443");
    // 設置用戶名密碼,AccessKey ID:AccessKey Secret,可根據實際情況調整
    conf.set("hbase.client.username", "AccessKey_ID");
    conf.set("hbase.client.password", "AccessKey_Secret");
    
    // 如果您直接依賴了阿里云hbase客戶端,則無需配置connection.impl參數,如果您依賴了alihbase-connector,則需要配置此參數
    //conf.set("hbase.client.connection.impl", AliHBaseUEClusterConnection.class.getName());
  3. 創建HBase連接。

    在用戶業務代碼中通過配置Configuration創建Connection。

    // 創建 HBase連接,在程序生命周期內只需創建一次,該連接線程安全,可以共享給所有線程使用。
    // 在程序結束后,需要把Connection對象關閉,否則會造成連接泄露。
    // 也可以采用try finally方式防止泄露
    Connection connection = ConnectionFactory.createConnection(conf);
  4. 建立完連接后,即可使用Java API訪問HBase Serverless集群,以下提供簡單的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();
      }