本文介绍通过配置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,以支持安全认证、公网访问等能力。
操作步骤
- 获取AccessKey_ID和AccessKey_Secret,请参见获取并使用Serverless HBase用户名和密码。
- 初始化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());
- 创建HBase连接。
在用户业务代码中通过配置Configuration创建Connection。
// 创建 HBase连接,在程序生命周期内只需创建一次,该连接线程安全,可以共享给所有线程使用。
// 在程序结束后,需要把Connection对象关闭,否则会造成连接泄露。
// 也可以采用try finally方式防止泄露
Connection connection = ConnectionFactory.createConnection(conf);
- 建立完连接后,即可使用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();
}