このトピックでは、ApsaraDB for HBase Java API を使用して LindormTable に接続する方法について説明し、例を示します。
前提条件
Java Development Kit(JDK) V1.8 以降がインストールされている。
Lindorm コンソールのワイドテーブルエンジンタブにある [hbase Java API を使用してアクセス] 後に表示される LindormTable エンドポイントを取得している。詳細については、「エンドポイントの表示」をご参照ください。
クライアントの IP アドレスが Lindorm インスタンスのホワイトリストに追加されている。詳細については、「ホワイトリストの設定」をご参照ください。
ApsaraDB for HBase SDK for Java がインストールされている。詳細については、「ApsaraDB for HBase SDK for Java のインストール」をご参照ください。
手順
Lindorm インスタンスに接続するようにクライアントを設定します。
設定ファイル hbase-site.xml に次の設定項目を追加します。
<configuration> <!-- // Lindorm インスタンスに接続するために使用できるエンドポイントを指定します。エンドポイントは、Lindorm コンソールのデータベース接続ページで確認できます。インターネット経由で Lindorm インスタンスに接続する場合は、パブリックエンドポイントを使用します。仮想プライベートクラウド (VPC) 経由で Lindorm インスタンスに接続する場合は、VPC エンドポイントを使用します。 --> <property> <name>hbase.zookeeper.quorum</name> <value>ld-xxxx-proxy-hbaseue.lindormue.xxx.rds.aliyuncs.com:30020</value> </property> <!-- Lindorm インスタンスへの接続に使用する実際のユーザー名とパスワードを指定します。デフォルトのユーザー名とパスワードはどちらも root です。 --> <property> <name>hbase.client.username</name> <value>testuser</value> </property> <property> <name>hbase.client.password</name> <value>password</value> </property> </configuration>次のコードスニペットをプロジェクトに追加して、Configuration オブジェクトを作成し、次の表に示すパラメーターを設定します。
// Configuration オブジェクトを作成します。 Configuration conf = HBaseConfiguration.create(); // Lindorm インスタンスのパブリックエンドポイントを指定します。パブリックエンドポイントは Lindorm コンソールのデータベース接続ページで取得できます。 conf.set("hbase.zookeeper.quorum", "host:port"); // xml_template.comment.hbaseue.username_password.default conf.set("hbase.client.username", "Username"); conf.set("hbase.client.password", "Password");注釈
例
パラメーター値の取得方法
host:port
ld-bp17j28j2y7pm****-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30020
Lindorm コンソールのワイドテーブルエンジンタブにある [hbase Java API を使用してアクセス] 後に表示される LindormTable エンドポイント。詳細については、「エンドポイントの表示」をご参照ください。
ユーザー名。
testuser
Lindorm インスタンスへの接続に使用するユーザー名とパスワード。パスワードを忘れた場合は、LindormTable のクラスタ管理システムでパスワードを変更できます。詳細については、「ユーザーのパスワードを変更する」をご参照ください。
パスワード
password
Lindorm クライアントとデータベース間の接続を確立します。
Connection connection = ConnectionFactory.createConnection(conf);説明接続は、プログラムのライフサイクル中に一度だけ作成されます。接続はスレッドセーフであり、すべてのスレッド間で共有できます。// プログラムの実行が停止した後、接続リークを防ぐために Connection オブジェクトを閉じます。接続リークを防ぐために try-finally ステートメントを実行することもできます。
接続が確立されたら、ApsaraDB for HBase Java API を使用して LindormTable にアクセスします。次の Java コード例を使用できます。
DDL 操作
try (Admin admin = connection.getAdmin()){ // テーブルを作成します。 HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename")); htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family"))); // パーティションが 1 つだけのテーブルを作成します。 // テーブルにパーティションが 1 つしかない場合、クラスタの並列処理能力とロードバランシング能力は制限されます。そのため、データ特性に基づいて事前にテーブルをパーティション分割することをお勧めします。すべてのデータが同じパーティションに格納されている場合、パーティション間の並列処理とロードバランシングを実装できません。これは、パフォーマンスのボトルネックとホットスポットデータにつながる可能性があります。 admin.createTable(htd); // 複数のパーティションを持つテーブルを作成するには、次のサンプルコードを参照してください。 // サンプルコードでは、テーブルは [-∞, 10) と [10, ∞) の 2 つのパーティションに事前に分割されています。実際のビジネスに基づいてパーティション範囲を指定します。 // int numRegions = 2; // パーティションの数を指定します。 // 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); // テーブルを無効にします。 admin.disableTable(TableName.valueOf("tablename")); // テーブル内のすべてのデータをクリアします。テーブル内のすべてのデータをクリアする前に、テーブルを無効にする必要があります。 admin.truncateTable(TableName.valueOf("tablename"), true); // テーブルを削除します。テーブルを削除する前に、テーブルを無効にする必要があります。 admin.deleteTable(TableName.valueOf("tablename")); }DML 操作
// テーブルはスレッドセーフではないオブジェクトです。スレッドがテーブルで操作を実行する場合、スレッドは Connection オブジェクトから必要なテーブルを取得する必要があります。 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); // 1 行のデータを読み取ります。 Get get = new Get(Bytes.toBytes("row")); Result res = table.get(get); // データの行を削除します。 Delete delete = new Delete(Bytes.toBytes("row")); table.delete(delete); // 指定された範囲のデータをスキャンします。 Scan scan = new Scan(Bytes.toBytes("startRow"), Bytes.toBytes("endRow")); ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { // 結果を処理します。 // ... } scanner.close(); }