Apache Phoenixを試してみた

Cloudera LabsにApache Phoenixが!

@shiumachiさんのツイートにもあるように、SQL on HBaseの実相である Apache PhoenixがCloudera Labに追加されました。

Apache Phoenix

Apache PhoenixはOSSで開発されている、HBase上のリレーショナルデータベースのレイヤーです。多くの人が慣れているSQLを利用して、低遅延でHBaseのデータにアクセスができます。http://phoenix.apache.org/index.html

HBaseはGoogleのBigtableを参考に開発されている低遅延なNoSQLの一つですが、ネイティブでSQLに対応していません。データへのアクセスはプログラムから(あるいはhbase shellから)行う必要があります。

SQLでHBaseにアクセスしたい場合、今まではHiveやImpalaから利用することもできました。しかし、これらはHBaseへのアクセスが主目的ではなく効率が良くありません。PhoenixはHBaseのみをターゲットにしているため効率が良いのです。

以下のClouderaのブログの表にもあるように、それぞれ特色があります。

  • Apache Phoenix:HBase上のデータに対して低遅延でアクセス
  • Cloudera Impala:大量データセットに対して対話的な分析
  • Apache Hive:ETLなどのバッチ

目的が異なるため、PhoenixやImpalaだけで全て解決、ということにはならないので注意が必要です。

Cloudera Quickstart VMでPhoenixを試す

手順はドキュメントに記載されており、やることもあまり多くはないので概ね問題なくセットアップできるはずです。(Cloudera Managerのおかげです。ありがとう!)。なおPhoenixにはHBase 1.0が必要なので、CDH5.4にアップデート(もしくはCDH5.4のQuickstart VMを利用)してから使ってみてください。

ParcelのレポジトリにPhoenixのURLを追加

phoenix_repo

CLABS_PHOENIXのダウンロード

ダウンロード、配布、アクティブ化を行います。
cm_phoenix

アクティブ化済みの状態

cm_phoenix2

安全バルブに以下のプロパティを追加

ドキュメントに従い以下のプロパティをhbase-site.xmlの高度な設定にある、安全バルブに追加します。


<property>
 <name>hbase.regionserver.wal.codec</name>
 <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

phoenix_xml設定を保存し、HBaseのサービスを再起動します。

Phoenixを使って見る

ドキュメントにあるように、環境変数を設定して対話的なシェルを実行します。


[cloudera@quickstart hbase]$  export JAVA_HOME=/usr/java/jdk1.7.0_67-cloudera
[cloudera@quickstart hbase]$  export PATH=$PATH:$JAVA_HOME/bin
[cloudera@quickstart hbase]$ /usr/bin/phoenix-sqlline.py quickstart.cloudera:2181
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:quickstart.cloudera:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:quickstart.cloudera:2181
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
15/05/07 07:16:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
15/05/07 07:16:33 WARN impl.MetricsConfig: Cannot locate configuration: tried hadoop-metrics2-phoenix.properties,hadoop-metrics2.properties
Connected to: Phoenix (version 4.3)
Driver: PhoenixEmbeddedDriver (version 4.3)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
70/70 (100%) Done
Done
sqlline version 1.1.8
0: jdbc:phoenix:quickstart.cloudera:2181>

コマンドプロンプトが表示されました。 無事に起動したようです!(なお、プロンプトが戻ってくるまでそれなりに時間がかかります。)

それでは、公式ドキュメントのFAQのHello Worldに従って、テーブルを作ってデータを投入し、クエリしてみましょう。

0: jdbc:phoenix:quickstart.cloudera:2181> create table test (mykey integer not null primary key, mycolumn varchar);
1 row affected (0.016 seconds)
0: jdbc:phoenix:quickstart.cloudera:2181> upsert into test values (1,'Hello');
1 row affected (0.016 seconds)
0: jdbc:phoenix:quickstart.cloudera:2181> upsert into test values (2,'World!');
1 row affected (0.007 seconds)
0: jdbc:phoenix:quickstart.cloudera:2181> select * from test;
+------------------------------------------+-----------------------------------+
|                  MYKEY                   |                 MYCOLUMN          |
+------------------------------------------+-----------------------------------+
| 1                                        | Hello                             |
| 2                                        | World!                            |
+------------------------------------------+-----------------------------------+
2 rows selected (0.086 seconds)
0: jdbc:phoenix:quickstart.cloudera:2181>

うまくいきました!簡単ですね!

さて、次は

手元の環境では以下のような問題に遭遇しています。調査していないので原因は不明ですが、そのうちにクリーンインストールしたQuickstart VM環境で試してみる予定です。

  • Quickstart に書かれている、非対話形式(phoenix_psql.py)でのクエリはうまくいかず
    • テーブルは作成されクエリもエラーにならないが、データがupsertされない。従ってSELECTの結果が0件になってしまう。なぜ?
  • テーブル一覧にテーブルが表示されない (phoenix-sqlline.pyから!tables)。なぜ?
  • 特定のテーブルの列情報が見えない (phoenix-sqlline.pyから!columns table名)。なぜ?

 

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)