このトピックでは、Tablestore HBase Client を使用して、Tablestore にアクセスできるプログラムを開発する方法について説明します。
前提条件
HBase データは Tablestore に移行されます。詳細については、「Data Integration」をご参照ください。
RAM ユーザーが作成され、Tablestore に対する操作を実行するための権限が RAM ユーザーに付与されます。詳細については、「RAM ユーザーの AccessKey ペアを使用してリクエストを開始する」をご参照ください。
手順
この例では、HBase V2.x.x と互換性のある Tablestore HBase Client を使用しています。
手順 1: Tablestore HBase クライアントの依存関係をインポートする
プロジェクトの pom.xml ファイルに次の依存関係を追加します。
<dependencies>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore-hbase-client</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies> 手順 2: HBase ファイルを構成する
hbase-site.xml ファイルに次のパラメーターを追加し、アクセスする Tablestore インスタンスのエンドポイント、アクセスする Tablestore インスタンスの名前、およびビジネス要件に基づいた RAM ユーザーの AccessKey ペアを構成します。
<configuration>
<property>
<name>hbase.client.connection.impl</name>
<value>com.alicloud.tablestore.hbase.TablestoreConnection</value>
</property>
<property>
<name>tablestore.client.endpoint</name>
<value>endpoint</value>
</property>
<property>
<name>tablestore.client.instancename</name>
<value>instance_name</value>
</property>
<property>
<name>tablestore.client.accesskeyid</name>
<value>access_key_id</value>
</property>
<property>
<name>tablestore.client.accesskeysecret</name>
<value>access_key_secret</value>
</property>
<property>
<name>hbase.client.tablestore.family</name>
<value>f1</value>
</property>
<property>
<name>hbase.client.tablestore.table</name>
<value>ots_adaptor</value>
</property>
</configuration> 手順 3: Tablestore に接続する
以下のサンプルコードは、Tablestore に接続するための TableStoreConnection オブジェクトを作成する方法の例を示しています。
Configuration config = HBaseConfiguration.create();
// Tablestore 接続オブジェクトを作成します。
Connection connection = ConnectionFactory.createConnection(config);
// Admin は、テーブルの作成、管理、削除に使用されます。
Admin admin = connection.getAdmin(); 手順 4:テーブル操作を実行する
テーブルを作成する
次のサンプル コードは、特定の名前を持つテーブルを作成する方法の例を示しています。この例では、MaxVersion パラメーターと TimeToLive パラメーターのデフォルト値が使用されます。
// 1 つのカラムファミリーのみを含む HTableDescriptor を作成します。
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
// MaxVersion パラメーターと TimeToLive パラメーターのデフォルト値が使用されるカラムファミリーを作成します。MaxVersion パラメーターのデフォルト値は 1 です。TimeToLive パラメーターのデフォルト値は Integer.INF_MAX です。
descriptor.addFamily(new HColumnDescriptor(COLUMN_FAMILY_NAME));
// Admin の createTable 操作を使用してテーブルを作成します。
System.out.println("Create table " + descriptor.getNameAsString());
admin.createTable(descriptor); テーブルを削除する
次のサンプル コードは、Admin API を使用してテーブルを削除する方法の例を示しています。
System.out.println("Delete the table");
admin.disableTable(table.getName());
admin.deleteTable(table.getName()); 手順 5: 基本的なデータ操作を実行する
データを書き込む
以下のサンプルコードは、Tablestore にデータ行を書き込む方法の例を示しています。
// 読み取り、書き込み、更新、削除などの操作を実行するための Tablestore テーブルを作成します。
Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
// プライマリキー値が row_1 の行を書き込むための PUT オブジェクトを作成します。
System.out.println("Write one row to the table");
Put put = new Put(ROW_KEY);
// 行の属性カラムを Tablestore に追加します。Tablestore は単一のカラムファミリーのみをサポートしています。hbase-site.xml 構成ファイルでファミリー名を指定する必要があります。hbase-site.xml 構成ファイルでファミリー名を指定しない場合、デフォルト値 f が使用されます。したがって、Tablestore にデータを書き込む場合、COLUMN_FAMILY_NAME パラメーターは空のままにすることができます。
put.addColumn(COLUMN_FAMILY_NAME, COLUMN_NAME, COLUMN_VALUE);
// HBase API を使用して PUT 操作を呼び出し、行を Tablestore に書き込みます。
table.put(put); データの読み取り
1 行のデータを読み取る
次のサンプル コードは、行のデータを読み取る方法の例を示しています。
// プライマリキー値が ROW_KEY の行を読み取るための GET オブジェクトを作成します。 Result getResult = table.get(new Get(ROW_KEY)); Result result = table.get(get); // 結果を表示します。 String value = Bytes.toString(getResult.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME)); System.out.println("Get one row by row key"); System.out.printf("\t%s = %s\n", Bytes.toString(ROW_KEY), value);スキャンデータ
プライマリキーの値が特定の範囲内にあるデータを読み取ります。
// テーブル内のすべての行のデータをスキャンします。 System.out.println("Scan for all rows:"); Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); // 結果を循環的に出力します。 for (Result row : scanner) { byte[] valueBytes = row.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME); System.out.println('\t' + Bytes.toString(valueBytes)); }
完全なサンプルコード
このトピックのサンプル プログラムは、HBase API を使用して Tablestore にアクセスします。完全なサンプル プログラムは、GitHub の src/test/java/samples/HelloWorld.javaHBase プロジェクトの ディレクトリにあります。
package samples;
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.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class HelloWorld {
/** データテーブルの名前を指定します。 **/
private static final byte[] TABLE_NAME = Bytes.toBytes("HelloTablestore");
/** 行のプライマリキーを指定します。 **/
private static final byte[] ROW_KEY = Bytes.toBytes("row_1");
/** カラムファミリーを指定します。 **/
private static final byte[] COLUMN_FAMILY_NAME = Bytes.toBytes("f");
/** カラムの名前を指定します。 **/
private static final byte[] COLUMN_NAME = Bytes.toBytes("col_1");
/** カラムの値を指定します。 **/
private static final byte[] COLUMN_VALUE = Bytes.toBytes("col_value");
public static void main(String[] args) {
helloWorld();
}
private static void helloWorld() {
try {
// Tablestore に接続します。
Configuration config = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(config);
Admin admin = connection.getAdmin();
// データテーブルを作成します。
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
descriptor.addFamily(new HColumnDescriptor(COLUMN_FAMILY_NAME));
System.out.println("Create table " + descriptor.getNameAsString());
admin.createTable(descriptor);
// Tablestore にデータを書き込みます。
Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
System.out.println("Write one row to the table");
Put put = new Put(ROW_KEY);
put.addColumn(COLUMN_FAMILY_NAME, COLUMN_NAME, COLUMN_VALUE);
table.put(put);
Result getResult = table.get(new Get(ROW_KEY));
// 単一行のデータを読み取ります。
String value = Bytes.toString(getResult.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME));
System.out.println("Get a one row by row key");
System.out.printf("\t%s = %s\n", Bytes.toString(ROW_KEY), value);
// データをスキャンします。
Scan scan = new Scan();
System.out.println("Scan for all rows:");
ResultScanner scanner = table.getScanner(scan);
for (Result row : scanner) {
byte[] valueBytes = row.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME);
System.out.println('\t' + Bytes.toString(valueBytes));
}
// データテーブルを削除します。
System.out.println("Delete the table");
admin.disableTable(table.getName());
admin.deleteTable(table.getName());
// 接続を閉じます。
table.close();
admin.close();
connection.close();
} catch (IOException e) {
System.err.println("Exception while running HelloTablestore: " + e.toString());
System.exit(1);
}
}
} 参考資料
他のバージョンの HBase Client または Tablestore SDK for Java を使用できます。詳細については、「Tablestore HBase Client の概要」をご参照ください。
詳細については、「HBase クライアントから Tablestore HBase クライアントに移行する」をご参照ください。