HBase Java API を使用して ApsaraDB for HBase Performance-enhanced Edition インスタンスに接続し、DDL 操作および DML 操作を実行します。
仕組み
HBase Java クライアントは、次の 3 つのコアオブジェクトを使用します。これらの役割とスレッド動作を理解することで、最も一般的な接続エラーを回避できます。
| オブジェクト | 重み | スレッドセーフ | 責任 |
|---|---|---|---|
Connection | ヘビーウェイト | はい — 全スレッドで共有可能 | クラスターへの接続を管理します。アプリケーションごとに 1 回作成し、シャットダウン時にクローズします。 |
Admin | ライトウェイト | — | DDL 操作:テーブルの作成、無効化、切り捨て、削除。必要に応じて作成し、完了後にクローズします。 |
Table | ライトウェイト | いいえ — 各スレッドが独自のインスタンスを必要とします | DML 操作:put、get、delete、scan。スレッドごとに作成し、完了後にクローズします。 |
Connection の作成コストは高いため、1 つのインスタンスを共有します。Table はスレッドセーフではないため、スレッド間でインスタンスを共有してはいけません。各スレッドで接続から新しいインスタンスを取得してください。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
ApsaraDB for HBase SDK for Java がインストールされていること。詳細については、「ApsaraDB for HBase SDK for Java のダウンロード」をご参照ください。
内部ネットワーク接続の場合、HBase インスタンスと同じ VPC に Elastic Compute Service (ECS) インスタンスをデプロイし、その ECS インスタンスの IP アドレスを HBase インスタンスのホワイトリストに追加する必要があります。詳細については、ECS インスタンスの作成およびホワイトリストの設定をご参照ください。
インターネット 接続の場合:インスタンスに対して IP アドレスホワイトリストが設定されていること。「ホワイトリストの設定」をご参照ください。
インスタンスへの接続
ステップ 1:クライアント接続構成の取得
ApsaraDB for HBase コンソールにログインします。
クラスター ページで対象のインスタンスを見つけ、その ID をクリックします。

インスタンス詳細ページ の左側ナビゲーションウィンドウで、データベース接続 をクリックします。
構成項目の生成 をクリックします。クライアント接続構成 ダイアログボックスで、Java 構成 タブをクリックし、Java コードをコピーします。

ステップ 2:クライアントの初期化
コピーした Java 構成コードをプロジェクトに貼り付け、Configuration オブジェクトを作成します。
// Configuration オブジェクトを作成します。
Configuration conf = HBaseConfiguration.create();
// エンドポイントを設定します。インターネット接続の場合はパブリックエンドポイントを、
// 内部ネットワーク接続の場合は VPC 向けエンドポイントを使用します。
// 両方のエンドポイントはコンソールの [データベース接続] ページで確認できます。
conf.set("hbase.zookeeper.quorum", "ld-xxxx-proxy-hbaseue.hbaseue.xxx.rds.aliyuncs.com:30020");
// ユーザー名とパスワードを設定します。デフォルト値はいずれも "root" です。
conf.set("hbase.client.username", "root");
conf.set("hbase.client.password", "root");
// alihbase-connector 依存関係を使用する場合のみ必要です。
// alihbase-client 依存関係を使用する場合は不要です。
//conf.set("hbase.client.connection.impl", AliHBaseUEClusterConnection.class.getName());ステップ 3:接続の作成
アプリケーションのライフサイクル全体で単一の Connection を作成します。このオブジェクトはスレッドセーフであり、全スレッドで共有できます。
// Connection はヘビーウェイトオブジェクトです。1 回作成して再利用してください。
// すべての操作が完了したらクローズし、接続リークを防止します。
Connection connection = ConnectionFactory.createConnection(conf);ヒント: 例外が発生した場合でも確実にクローズされるように、接続を try-finally ブロックで囲んでください。DDL 操作および DML 操作の実行
DDL 操作
テーブル管理には Admin を使用します。Admin はライトウェイトであるため、必要に応じて作成し、完了後にクローズしてください。
try (Admin admin = connection.getAdmin()) {
// カラムファミリーを 1 つ持つテーブルを作成します。
// 本番環境では、データ分散に基づいて事前にテーブルをプレスプリットしてください。
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename"));
htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family")));
admin.createTable(htd);
// テーブルを無効化します。
admin.disableTable(TableName.valueOf("tablename"));
// テーブルを切り捨てます(テーブル構造は保持されます)。
admin.truncateTable(TableName.valueOf("tablename"), true);
// テーブルを削除します。
admin.deleteTable(TableName.valueOf("tablename"));
}DML 操作
データ操作には Table を使用します。Table はスレッドセーフではないため、各スレッドが接続から独自のインスタンスを取得する必要があります。
// Table はライトウェイトかつスレッドセーフではありません。スレッドごとに新しいインスタンスを取得し、
// スレッド間で 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 = new Scan(Bytes.toBytes("startRow"), Bytes.toBytes("endRow"));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
// 各結果を処理します。
}
scanner.close();
}完全なサンプルコード
以下の自己完結型クラスは、上記のすべての手順をまとめたものです。プロジェクトにコピーし、エンドポイントを実際の値に置き換えて実行すると、接続性を検証できます。
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseQuickStart {
public static void main(String[] args) throws IOException {
// --- 構成 ---
Configuration conf = HBaseConfiguration.create();
// [データベース接続] ページから実際のエンドポイントに置き換えてください。
conf.set("hbase.zookeeper.quorum", "ld-xxxx-proxy-hbaseue.hbaseue.xxx.rds.aliyuncs.com:30020");
conf.set("hbase.client.username", "root");
conf.set("hbase.client.password", "root");
// alihbase-connector 依存関係を使用する場合はコメントアウトを解除します:
//conf.set("hbase.client.connection.impl", AliHBaseUEClusterConnection.class.getName());
// --- 接続 ---
// Connection はヘビーウェイトです。1 回作成して全スレッドで共有します。
// finally ブロック内でクローズし、接続リークを防止します。
Connection connection = ConnectionFactory.createConnection(conf);
try {
// --- DDL:テーブルの作成 ---
// Admin はライトウェイトです。必要に応じて作成し、完了後にクローズします。
try (Admin admin = connection.getAdmin()) {
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("tablename"));
htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family")));
// 本番環境では、データ分散に基づいて事前にテーブルをプレスプリットしてください。
admin.createTable(htd);
}
// --- DML:データの書き込みと読み取り ---
// Table はライトウェイトかつスレッドセーフではありません。
// 各スレッドは接続から独自の 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);
// 行範囲をスキャンします — キー範囲に対するカーソル形式のアクセス。
Scan scan = new Scan(Bytes.toBytes("startRow"), Bytes.toBytes("endRow"));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
// 各結果を処理します。
}
scanner.close();
// 行を削除します。
Delete delete = new Delete(Bytes.toBytes("row"));
table.delete(delete);
}
// --- DDL:クリーンアップ ---
try (Admin admin = connection.getAdmin()) {
admin.disableTable(TableName.valueOf("tablename"));
admin.deleteTable(TableName.valueOf("tablename"));
}
} finally {
connection.close();
}
}
}