Apache Phoenixを試す(補足)

昨晩Apache Phoenixを試してみました。手元の環境ではいくらか問題が生じているものの、SQLでアクセスできるのは強力ですね。一方、HBaseには実際にどのようにデータが格納されているのかも気になります。hbase shellからはどのように見えるのか、備忘録がてら貼っておきます。

参考までに、作成したテーブルは

  • テーブル名:test
  • 列1:(主キー)mykey integer
  • 列2:mycolumn varchar
  • 格納されているレコード
    +——————————————+———————————–+
    |                  MYKEY                   |                 MYCOLUMN          |
    +——————————————+———————————–+
    | 1                                        | Hello                             |
    | 2                                        | World!                            |
    +——————————————+———————————–+

です。hbase shellで確認します。


[cloudera@quickstart ~]$ hbase shell
15/05/07 17:41:00 INFO Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.0-cdh5.4.0, rUnknown, Tue Apr 21 12:21:37 PDT 2015

hbase(main):001:0> list
SYSTEM.CATALOG
SYSTEM.SEQUENCE
SYSTEM.STATS
TEST
9 row(s) in 0.2980 seconds

=> ["PHOENIX_TABLE", "PHOENIX_TABLEW", "SYSTEM.CATALOG", "SYSTEM.SEQUENCE", "SYSTEM.STATS", "TEST", "US_POPULATION", "ns01:test-table", "t1"]

TESTテーブルが存在していることがわかります。(大文字になっていますね)。

続いてテーブルの情報を表示します。コプロセッサが大量に利用されていますね。

hbase(main):003:0> describe 'TEST'
Table TEST is ENABLED
TEST, {TABLE_ATTRIBUTES => {coprocessor$1 => '|org.apache.phoenix.coprocessor.ScanRegionObser
ver|805306366|', coprocessor$2 => '|org.apache.phoenix.coprocessor.UngroupedAggregateRegionOb
server|805306366|', coprocessor$3 => '|org.apache.phoenix.coprocessor.GroupedAggregateRegionO
bserver|805306366|', coprocessor$4 => '|org.apache.phoenix.coprocessor.ServerCachingEndpointI
mpl|805306366|', coprocessor$5 => '|org.apache.phoenix.hbase.index.Indexer|805306366|index.bu
ilder=org.apache.phoenix.index.PhoenixIndexBuilder,org.apache.hadoop.hbase.index.codec.class=
org.apache.phoenix.index.PhoenixIndexCodec', coprocessor$6 => '|org.apache.hadoop.hbase.regio
nserver.LocalIndexSplitter|805306366|'}
COLUMN FAMILIES DESCRIPTION
{NAME => '0', DATA_BLOCK_ENCODING => 'FAST_DIFF', BLOOMFILTER => 'ROW', REPLICATION_SCOPE =>
'0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELE
TED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.4230 seconds

列ファミリーは’0’という名前になっています。ではテーブルをスキャンしてみましょう。


hbase(main):004:0> scan 'TEST'
ROW                      COLUMN+CELL
\x80\x00\x00\x01        column=0:MYCOLUMN, timestamp=1431015562977, value=Hello
\x80\x00\x00\x01        column=0:_0, timestamp=1431015562977, value=
\x80\x00\x00\x02        column=0:MYCOLUMN, timestamp=1431015578375, value=World!
\x80\x00\x00\x02        column=0:_0, timestamp=1431015578375, value=
2 row(s) in 0.1470 seconds

hbase(main):005:0>

この結果から、以下のようになっているようです。

  • 列名(mycolumn)は0:MYCOLUMNのように、列修飾子として表現される
  • Primary Keyは別の扱いになる
  • 数値は数字として格納されている

Pheonixが自動で作成した SYSTEM.CATALOG テーブルをみてみたところ、テーブルや列に関する情報が格納されていました。


\x00\x00TEST            column=0:COLUMN_COUNT, timestamp=1431046224209, value=\x80\x00\x00\x
\x00\x00TEST            column=0:DISABLE_WAL, timestamp=1431046224209, value=\x00
\x00\x00TEST            column=0:IMMUTABLE_ROWS, timestamp=1431046224209, value=\x00
\x00\x00TEST            column=0:MULTI_TENANT, timestamp=1431046224209, value=\x00
\x00\x00TEST            column=0:STORE_NULLS, timestamp=1431046224209, value=\x00
\x00\x00TEST            column=0:TABLE_SEQ_NUM, timestamp=1431046224209, value=\x80\x00\x00\
\x00\x00TEST            column=0:TABLE_TYPE, timestamp=1431046224209, value=u
\x00\x00TEST            column=0:_0, timestamp=1431046224209, value=
\x00\x00TEST\x00MYCOLUM column=0:DATA_TYPE, timestamp=1431046224209, value=\x80\x00\x00\x0C
\x00\x00TEST\x00MYCOLUM column=0:IS_VIEW_REFERENCED, timestamp=1431046224209, value=\x00
\x00\x00TEST\x00MYCOLUM column=0:NULLABLE, timestamp=1431046224209, value=\x80\x00\x00\x01
\x00\x00TEST\x00MYCOLUM column=0:ORDINAL_POSITION, timestamp=1431046224209, value=\x80\x00\x
\x00\x00TEST\x00MYCOLUM column=0:SORT_ORDER, timestamp=1431046224209, value=\x80\x00\x00\x02
\x00\x00TEST\x00MYCOLUM column=0:_0, timestamp=1431046224209, value=
\x00\x00TEST\x00MYKEY   column=0:DATA_TYPE, timestamp=1431046224209, value=\x80\x00\x00\x04
\x00\x00TEST\x00MYKEY   column=0:IS_VIEW_REFERENCED, timestamp=1431046224209, value=\x00
\x00\x00TEST\x00MYKEY   column=0:KEY_SEQ, timestamp=1431046224209, value=\x80\x01
\x00\x00TEST\x00MYKEY   column=0:NULLABLE, timestamp=1431046224209, value=\x80\x00\x00\x00
\x00\x00TEST\x00MYKEY   column=0:ORDINAL_POSITION, timestamp=1431046224209, value=\x80\x00\x
\x00\x00TEST\x00MYKEY   column=0:SORT_ORDER, timestamp=1431046224209, value=\x80\x00\x00\x02
\x00\x00TEST\x00MYKEY   column=0:_0, timestamp=1431046224209, value=

(当たり前といえば当たり前ですが)、Phoenixで作成したテーブルをHBaseから扱うのは無理っぽいです。

 

Pocket

Leave a Reply

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

CAPTCHA


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