使用Java API訪問增強版集群
本文介紹如何通過HBase Java API訪問云數(shù)據(jù)庫HBase增強版實例。
前提條件
已安裝Java SDK,具體操作請參見升級HBase Java SDK。
如果應(yīng)用部署在ECS實例,您需要確保云數(shù)據(jù)庫HBase增強版實例和ECS實例滿足以下條件,以保證網(wǎng)絡(luò)的連通性。ECS實例信息的查看方法請參見查看實例信息。
所在地域相同,并建議所在可用區(qū)相同(以減少網(wǎng)絡(luò)延時)。
網(wǎng)絡(luò)類型相同。
說明專有網(wǎng)絡(luò)具有更高的安全性,建議使用專有網(wǎng)絡(luò)。如果網(wǎng)絡(luò)類型為專有網(wǎng)絡(luò),需確保使用相同的專有網(wǎng)絡(luò)ID。
已將ECS實例的IP地址或客戶端IP地址添加至云數(shù)據(jù)庫HBase增強版實例的白名單中,具體操作請參見設(shè)置白名單。
操作步驟
初始化HBase配置。在Project中輸入下述代碼,然后根據(jù)下表描述配置參數(shù)。
// 新建一個Configuration Configuration conf = HBaseConfiguration.create(); // 集群的Java API訪問地址,在控制臺頁面的數(shù)據(jù)庫連接界面獲得 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參數(shù),如果您依賴了alihbase-connector,則需要配置此參數(shù) //conf.set("hbase.client.connection.impl", AliHBaseUEClusterConnection.class.getName());
參數(shù)
示例值
獲取方法
host:port
ld-bp150tns0sjxs****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020
云數(shù)據(jù)庫HBase增強版實例的Java API訪問地址的連接地址,可以通過云數(shù)據(jù)庫HBase控制臺查看,單擊目標(biāo)實例,左側(cè)導(dǎo)航欄選擇數(shù)據(jù)庫連接,在連接信息區(qū)域查看Java API訪問地址。
用戶名
testuser
如果您忘記用戶名密碼,可以通過云數(shù)據(jù)庫HBase的集群管理系統(tǒng)修改密碼,具體操作請參見管理用戶。
密碼
password
建立云數(shù)據(jù)庫HBase增強版和數(shù)據(jù)之間的連接。
Connection connection = ConnectionFactory.createConnection(conf);
說明連接在程序生命周期內(nèi)只需創(chuàng)建一次,該連接線程安全,可以共享給所有線程使用。在程序結(jié)束后,需要將Connection對象關(guān)閉,否則會造成連接泄露。也可以采用try finally方式防止泄露。
建立完連接后,即可使用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"))); //創(chuàng)建一個只有一個分區(qū)的表 //在生產(chǎn)上建表時建議根據(jù)數(shù)據(jù)特點預(yù)先分區(qū) admin.createTable(htd); //禁用表 admin.disableTable(TableName.valueOf("tablename")); //清空表 admin.truncateTable(TableName.valueOf("tablename"), true); //刪除表 admin.deleteTable(TableName.valueOf("tablename")); }
DML操作
//Table為非線程安全對象,每個線程在對Table操作時,都必須從Connection中獲取相應(yīng)的Table對象 try (Table table = connection.getTable(TableName.valueOf("tablename"))) { //插入數(shù)據(jù) 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); //刪除一行數(shù)據(jù) Delete delete = new Delete(Bytes.toBytes("row")); table.delete(delete); //scan范圍數(shù)據(jù) Scan scan = new Scan(Bytes.toBytes("startRow"), Bytes.toBytes("endRow")); ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { //處理查詢結(jié)果result // ... } scanner.close(); }