HDInsight HBase で Apache Phoenix を使用する

完了

HDInsight の HBase クラスターには Apache Phoenix が付属しています。 Apache Phoenix は、Apache HBase 上に構築されるオープンソースの超並列リレーショナル データベース レイヤーです。 Apache Phoenix を使用すると、HBase に対して SQL に似たクエリを使用できます。 基になっている JDBC ドライバーを使用して、ユーザーは SQL テーブルを作成、削除、変更できます。 また、インデックスの作成、ビューやシーケンスの作成、個別または一括での行の upsert を行うこともできます。 Phoenix は、MapReduce ではなく noSQL ネイティブ コンパイルを使ってクエリをコンパイルして、HBase に基づく待機時間の短いアプリケーションを作成できるようにします。 Phoenix では、コプロセッサを追加して、クライアントが指定したコードの実行をサーバーのアドレス空間でサポートすることにより、データと共存したコードを実行します。 このアプローチにより、クライアント/サーバーのデータ転送が最小限に抑えられます。 詳細については、Apache Phoenix のドキュメントを参照してください。

How Apache Phoenix interfaces with Apache HBase.

HDInsight HBase の Apache Phoenix は、通常、セルフサービスの分析を有効にし、分析情報を抽出するために使用されます (下図参照)。 Phoenix は任意の ODBC 互換 BI ツールに組み込むことができ、HBase でアドホックな SQL 分析を実行できます。

Self service with Apache HBase.

Apache HBase と Phoenix の組み合わせは、変更可能なデータ用のデータストアとして使用できます。 HBase の Apache Phoenix クエリ エンジンは、いくつかの重要な機能を備えています。

セカンダリ インデックス

HBase のレコードは、プライマリ行キーで辞書式に並べ替えられた 1 つのインデックスを使用し、プライマリ行キーを使用してアクセスされます。 プライマリ行以外の方法でレコードにアクセスしようとすると、HBase テーブル内のすべてのデータが非効率的にスキャンされる可能性があります。 Apache Phoenix を使用すると、列および式にセカンダリ インデックスを作成して代替行キーを作成し、この新しいインデックスでポイント参照または範囲スキャンを実行できます。 詳細については、Apache Phoenix のセカンダリ インデックスに関するドキュメントを参照してください。

次に示すように、HBase でセカンダリ インデックスを作成するには、CREATE INDEX コマンドを使用します。

CREATE INDEX ix_purchasetype on SALTEDWEBLOGS (purchasetype, transactiondate) INCLUDE (bookname, quantity); 

ビュー

HBase の物理テーブルの数を制限することにより、リージョンの数を制限することが、推奨される方法です。 Phoenix のビューを使用すると、HBase 上の同じ基になる物理テーブルを共有する複数の仮想テーブルを作成できるので、この推奨事項に役立ちます。 詳細については、Apache Phoenix でのビューに関するドキュメントを参照してください。

次のような HBase のテーブル定義があるとします。

CREATE  TABLE product_metrics (
    metric_type CHAR(1),
    created_by VARCHAR,
    created_date DATE,
    metric_id INTEGER
    CONSTRAINT pk PRIMARY KEY (metric_type, created_by, created_date, metric_id));

次のようなビューを定義できます。

CREATE VIEW mobile_product_metrics (carrier VARCHAR, dropped_calls BIGINT) AS SELECT * FROM product_metric WHERE metric_type = 'm';

トランザクション

HBase は行レベルのトランザクションでのみ動作しますが、Apache Phoenix を使用すると、Apache Tephra と統合することにより、完全な ACID をサポートするクロス テーブルとクロス行のトランザクションを実行できます。

詳細については、Apache Phoenix でのトランザクションに関するドキュメントを参照してください

次の例では、my_table という名前のテーブルを作成した後、そのテーブルをトランザクション対応に変更します。

CREATE TABLE my_table (k BIGINT PRIMARY KEY, v VARCHAR) TRANSACTIONAL=true;

ALTER TABLE my_other_table SET TRANSACTIONAL=true;

ソルティングされたテーブル

行キーが単調に増加する場合、順次書き込みの間に、HBase でリージョン サーバーがホットスポットになる可能性があります。 Apache Phoenix を使用すると、特定のテーブルに対しソルト化バイトを使用して行キーをソルト化する方法を提供することで、ホットスポットを軽減できます。 詳細については、Apache Phoenix のソルト化されたテーブルに関するドキュメントを参照してください。

CREATE TABLE Saltedweblogs (
    transactionid varchar(500) Primary Key,
    transactiondate Date NULL,
    customerid varchar(50) NULL,
    bookid varchar(50) NULL,
    purchasetype varchar(50) NULL,
    orderid varchar(50) NULL,
    bookname varchar(50) NULL,
    categoryname varchar(50) NULL,
    invoicenumber varchar(50) NULL,
    invoicestatus varchar(50) NULL,
    city varchar(50) NULL,
    state varchar(50) NULL,
    paymentamount DOUBLE NULL,
    quantity INTEGER NULL,
    shippingamount DOUBLE NULL) SALT_BUCKETS=4;

スキップ スキャン

特定の行セットについて、Apache Phoenix では、パフォーマンス向上のため、範囲スキャンではなく行内スキャンのスキップ スキャンが使用されます。 スキップ スキャンには、SEEK_NEXT_USING_HINT HBase フィルターが利用されます。 それには、各列で検索されているキーのセットおよびキーの範囲に関する情報が格納されます。 その後、(フィルター評価中に渡された) キーが取得され、それが組み合わせまたは範囲のいずれかに含まれるかどうかが調べられます。 そうでない場合は、ジャンプする次に高いキーが特定されます。 詳細については、Apache Phoenix でのスキップ スキャンに関するドキュメントを参照してください。

Apache Phoenix でのパフォーマンスの最適化は、オプションで要求される機能であり、基になっている HBase のパフォーマンスの最適化にほとんどを依存します。 パフォーマンスの最適化は複雑なトピックであり、このコースの範囲を超えています。 ただし、関心がある場合は、Apache Phoenix のパフォーマンスのベスト プラクティスに関するドキュメントを参照してください。