本文介紹通過HBase Java API訪問Lindorm寬表引擎的具體操作和使用樣本。
前提條件
已安裝Java環境,要求安裝JDK 1.8及以上版本。
已擷取Lindorm寬表引擎中使用HBase Java API訪問的串連地址,具體操作請參見查看串連地址。
將用戶端IP地址添加至Lindorm執行個體的白名單中,添加方法請參見設定白名單。
已完成HBase Java SDK的安裝。具體操作請參見安裝HBase Java SDK。
操作步驟
通過以下兩種方式配置用戶端串連Lindorm執行個體。
在設定檔hbase-site.xml中增加以下配置項。
<configuration> <!-- 叢集的串連地址,在控制台頁面的資料庫連接介面獲得(注意公網地址和VPC內網地址) --> <property> <name>hbase.zookeeper.quorum</name> <value>ld-xxxx-proxy-hbaseue.lindormue.xxx.rds.aliyuncs.com:30020</value> </property> <!-- 設定使用者名稱和密碼,預設均為root,可根據實際情況調整 --> <property> <name>hbase.client.username</name> <value>testuser</value> </property> <property> <name>hbase.client.password</name> <value>password</value> </property> </configuration>
在Project中輸入下述代碼建立Configuration,然後根據下表描述配置相關參數。
// 建立一個Configuration Configuration conf = HBaseConfiguration.create(); // 叢集的串連地址(公網地址)在控制台頁面的資料庫連接介面獲得 conf.set("hbase.zookeeper.quorum", "host:port"); // xml_template.comment.hbaseue.username_password.default conf.set("hbase.client.username", "使用者名稱"); conf.set("hbase.client.password", "密碼");
參數
樣本值
擷取方法
host:port
ld-bp17j28j2y7pm****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30020
Lindorm寬表引擎中使用HBase Java API訪問的串連地址,具體操作請參見查看串連地址。
使用者名稱
testuser
如果您忘記使用者名稱密碼,可以通過Lindorm寬表引擎的叢集管理系統修改密碼,具體操作請參見修改使用者密碼。
密碼
password
建立Lindorm用戶端和資料之間的串連。
Connection connection = ConnectionFactory.createConnection(conf);
說明在程式生命週期內只需建立一次,該連接線程安全,可以共用給所有線程使用。在程式結束後,需要將Connection對象關閉,否則會造成串連泄露。也可以採用try finally方式防止泄露。
串連建立後,可以使用HBase Java API訪問Lindorm寬表。下面提供一些簡單的Java樣本。
DDL操作
try (Admin admin = connection.getAdmin()){ // 建表 HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename")); htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family"))); // 建立一個只有一個分區的表 // 由於單Region會限制叢集平行處理能力和負載平衡效果,因此在建表時建議根據資料特點預先分區。所有的資料將儲存在同一個分區中,無法實現在多個分區間的平行處理和負載平衡。這可能導致效能瓶頸和資料熱點問題。 admin.createTable(htd); // 如果需要建立多個分區的表 // 樣本如下,預分區包含兩個分區,分別為: [-∞, 10),[10, ∞), 實際使用時請根據業務情況產生分區資訊 // int numRegions = 2; // 設定需要建立的Region的數量 // byte[][] splitKeys = new byte[numRegions-1][]; // for (int i = 1; i < numRegions; i++) { // splitKeys[i-1] = new byte[]{(byte)(i * 10)}; // } // admin.createTable(tableDescriptor, splitKeys); // disable表 admin.disableTable(TableName.valueOf("tablename")); // truncate表,清空表中資料,清空資料前需要先disable表 admin.truncateTable(TableName.valueOf("tablename"), true); // 刪除表,刪除表之前需要先disable表 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(); }