- Authors
- Name
事前確認
PhoenixはHBase上で動作するため、HBaseが既にインストールされている必要がある。インストールはこのドキュメントを参照して行う。PhoenixはHBaseとのバージョン互換性が重要だ。以前インストールしたHBaseのバージョンは2.5.3だ。HBaseのバージョンを確認するには、HMaster Web UIにアクセスするとページ下部でHBaseバージョンを確認できる。

2.5.xバージョンのHBaseにはPhoenix Version 5.1.3をインストールする必要がある。その他のバージョンはPhoenixダウンロードサイトを参考に適切なバージョンを見つければよい。

Apache Phoenixのインストール方法
HBaseが構築された状態であれば、インストール方法は比較的簡単だ。すべてのサーバーで以下のコマンドでPhoenixバイナリをダウンロードしてuntarする。
wget https://dlcdn.apache.org/phoenix/phoenix-5.1.3/phoenix-hbase-2.5-5.1.3-bin.tar.gz
tar -zxvf phoenix-hbase-2.5-5.1.3-bin.tar.gz
その後、生成されたphoenix-hbase-2.5-5.1.3-binフォルダのphoenix-server-hbase-2.5-5.1.3.jarファイルを、HMasterとRegionServerがインストールされたすべてのサーバーのlibディレクトリに配置する。
cd phoenix-hbase-2.5-5.1.3-bin
cp phoenix-server-hbase-2.5.jar /usr/local/hbase/lib/
cp phoenix-server-hbase-2.5-5.1.3.jar /usr/local/hbase/lib/
その後、HBaseを再起動する。
HBase再起動後
Phoenix sqlline.pyで接続する
phoenix-hbase-2.5-5.1.3-bin/binフォルダ内のhbase-site.xmlファイルを、接続したいHBaseのhbase-site.xmlに変更する。その後、以下のように実行するとPhoenixにJDBC経由で接続できる。
./sqlline.py
接続が成功すると、以下のようにHBaseテーブルにPhoenixが使用する様々なメタテーブルが作成されたことを確認できる。

stock_symbol.sqlの例を実行してみる
python sqlline.py latte01,latte02,latte03 ../examples/STOCK_SYMBOL.sql
SQLLineで!tablesで照会すると、STOCK_SYMBOLというテーブルが作成されたことを確認できる。

CRUDの例
テーブルのスキーマを確認するためにdescribeを実行する。
0: jdbc:phoenix:> !describe STOCK_SYMBOL
+-----------+-------------+--------------+-------------+-----------+-----------+-------------+---------------+----------------+----------------+----------+---------+------------+---------------+------------------+-------------------+--------+
| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | COLUMN_SIZE | BUFFER_LENGTH | DECIMAL_DIGITS | NUM_PREC_RADIX | NULLABLE | REMARKS | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINA |
+-----------+-------------+--------------+-------------+-----------+-----------+-------------+---------------+----------------+----------------+----------+---------+------------+---------------+------------------+-------------------+--------+
| | | STOCK_SYMBOL | SYMBOL | 12 | VARCHAR | null | null | null | null | 0 | | | null | null | null | 1 |
| | | STOCK_SYMBOL | COMPANY | 12 | VARCHAR | null | null | null | null | 1 | | | null | null | null | 2 |
+-----------+-------------+--------------+-------------+-----------+-----------+-------------+---------------+----------------+----------------+----------+---------+------------+---------------+------------------+-------------------+--------+
PKを確認するには!primarykeys テーブル名を入力する。
0: jdbc:phoenix:> !primarykeys STOCK_SYMBOL
+-----------+-------------+--------------+-------------+---------+---------+-------------+-----------+-----------+-------------+---------+---------------+
| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | KEY_SEQ | PK_NAME | ASC_OR_DESC | DATA_TYPE | TYPE_NAME | COLUMN_SIZE | TYPE_ID | VIEW_CONSTANT |
+-----------+-------------+--------------+-------------+---------+---------+-------------+-----------+-----------+-------------+---------+---------------+
| | | STOCK_SYMBOL | SYMBOL | 1 | | A | 12 | VARCHAR | null | 12 | |
+-----------+-------------+--------------+-------------+---------+---------+-------------+-----------+-----------+-------------+---------+---------------+
SELECT
0: jdbc:phoenix:> select * from STOCK_SYMBOL;
+--------+----------------+
| SYMBOL | COMPANY |
+--------+----------------+
| CRM | SalesForce.com |
+--------+----------------+
UPSERT
SQLLineでUPSERT時に注意すべき点は、ダブルクォートはエラーを発生させるため、シングルクォートを使用しなければならないことだ。
0: jdbc:phoenix:> UPSERT INTO STOCK_SYMBOL VALUES ('CRM2', 'youngju.dev');
1 row affected (0.1 seconds)
0: jdbc:phoenix:> UPSERT INTO STOCK_SYMBOL (SYMBOL, COMPANY) VALUES ('CRM3', 'chaos.and.order');
1 row affected (0.036 seconds)
0: jdbc:phoenix:> select * from STOCK_SYMBOL;
+--------+-----------------+
| SYMBOL | COMPANY |
+--------+-----------------+
| CRM | SalesForce.com |
| CRM2 | youngju.dev |
| CRM3 | chaos.and.order |
+--------+-----------------+
3 rows selected (0.054 seconds)
SELECTを実行すると、挿入した情報が正しく照会されることを確認できる。
JOIN
純粋なHBaseはJoinをサポートしないが、Phoenixを利用すればJoinを使用できる。 ただし、RDBMSほど高速ではない。
userテーブル
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER NOT NULL,
first_name VARCHAR,
last_name VARCHAR,
age INTEGER,
CONSTRAINT pk_users PRIMARY KEY (user_id)
);
ordersテーブル
CREATE TABLE IF NOT EXISTS orders (
order_id INTEGER NOT NULL,
user_id INTEGER,
product_name VARCHAR,
order_date DATE,
CONSTRAINT pk_orders PRIMARY KEY (order_id)
);
SELECT users.first_name, users.last_name, orders.product_name, orders.order_date
FROM users
JOIN orders ON users.user_id = orders.user_id;