このトピックでは、Table Store HBase Client を使用して単純な Hello World プログラムを実装する方法について説明します。次の操作が含まれます。

  • プロジェクトの依存関係を設定する
  • Table Store に接続する
  • テーブルを作成する
  • データを書き込む
  • データを読み込む
  • データをスキャンする
  • テーブルを削除する

コード位置

このサンプルプログラムは HBase API を使用して Table Store にアクセスします。 完全なサンプルプログラムは、Githubのaliyun-tablestore-hbase-client プロジェクトにあります。 ディレクトリは、 "src/test/java/samples/HelloWorld.java" です。

HBase API を使用する

  • プロジェクトの依存関係を設定する

    次のように Maven の依存関係を設定します。

       <dependencies>
            <dependency>
                <groupId>com.aliyun.openservices</groupId>
                <artifactId>tablestore-hbase-client</artifactId>
                <version>1.2.0</version>
            </dependency>
        </dependencies>
    

    詳細設定の詳細については、 「HBase から Table Store への移行」をご参照ください。

  • ファイルを設定する

    以下の設定項目を hbase-site.xml に追加します。

    <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>
    

    詳細設定の詳細については、 「HBase から Table Store への移行」をご参照ください。

  • テーブルストアに接続

    Table Store に接続するための TableStoreConnection オブジェクトを作成します。

    		Configuration config = HBaseConfiguration.create();
    		
    		// Tablestore Connectionを作成する
    		Connection connection = ConnectionFactory.createConnection(config);
    		
    		// 管理者は作成、管理、削除に使用される
            Admin admin = connection.getAdmin();
    
  • テーブルを作成する

    指定されたテーブル名を使ってテーブルを作成します。 MaxVersions と TimeToLive にはデフォルトのテーブル名を使用してください。

    		// ColumnFamily を 1 つだけ含む HTableDescriptor を作成する
    		HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
    		
    		// ColumnFamily を作成する。 Max Versions および TimeToLive にはデフォルトの ColumnFamily 名を使用してください。 Max Versions のデフォルトの ColumnFamily 名は 1、TimeToLive のデフォルトの ColumnFamily 名は Integer.INF_MAX です。
    		descriptor.addFamily(new HColumnDescriptor(COLUMN_FAMILY_NAME));
    		
    		// 管理者の createTable API を使用してテーブルを作成する
    		System.out.println("Create table " + descriptor.getNameAsString());
    		admin.createTable(descriptor);
    
  • データを書き込む

    1 行のデータを Table Store に書き込みます。

    		// 単一のテーブルに対する読み取り、書き込み、更新、削除、およびその他の操作用の Table Storeテーブルを作成する
    		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);
    		
    		// 列を追加する Table Store は単一の ColumnFamilies のみをサポートします。 ColumnFamily の名前は "hbase-site.xml" で設定されています。 ColumnFamily の名前が設定されていない場合、デフォルトの名前は "f" です。 この場合、データの書き込み時に COLUMN_FAMILY_NAME の値が null 値になることがあります。
    		put.addColumn(COLUMN_FAMILY_NAME, COLUMN_NAME, COLUMN_VALUE);
    		
    		// テーブルに対してputを実行し、HBase API を使用して Table Store にデータ行を書き込む
            table.put(put);
    
  • データを読み込む

    指定された行のデータを読み込みます。

    		// プライマリキーが 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));
    	}
    
  • テーブルを削除する

    管理 API を使用してテーブルを削除します。

    		print("Delete the table");
    		admin.disableTable(table.getName());
    		admin.deleteTable(table.getName());
    

コードの完了

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  {
            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);

            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);
        }
    }
}