HBaseにアクセスしてみよう
それでは、実際にHBaseにshell経由でアクセスしてみましょう。HBase shellを起動します。
$ bin/hbase shell
最初にTableを作成します。"tbl"という名前のTableを作成し、"fam"という名前のColumnFamilyを定義します。
$ create "tbl", "fam" 0 row(s) in 1.0730 seconds
次に、データをputしてみます。putは第1引数はTable、第2引数はRowKey、第3引数はColumnFamily:Column、第4引数は値を指定します。
$ put "tbl", "row1", "fam:col1", "val1" 0 row(s) in 0.0230 seconds
上記では、"tbl"というTableに、RowKeyが"row1"で、ColumnFamily:Columnが"fam:col1"、値が"val1"のRowをputしています。
次は、データをgetしてみます。
$ get "tbl", "row1", "fam:col1" COLUMN CELL fam:col1 timestamp=1357042356309, value=val1 1 row(s) in 0.0190 seconds
今度は、同じTable、RowKey、ColumnFamily:Columnで別の値を入れてみます。
$ put "tbl", "row1", "fam:col1", "val2"
再度getしてみると、値が更新されていることが分かります。
$ get "tbl", "row1", "fam:col1" COLUMN CELL fam:col1 timestamp=1357042434369, value=val2 1 row(s) in 0.0200 seconds
ここで、以下のようにバージョン数を指定してgetしてみます。
$ get "tbl", "row1", {COLUMN => "fam:col1", VERSIONS => 2} COLUMN CELL fam:col1 timestamp=1357042434369, value=val2 fam:col1 timestamp=1357042356309, value=val1 2 row(s) in 0.0210 seconds
このように、HBaseではColumnに対して複数のバージョン(デフォルトで3)を持つことができます。バージョン数を指定しなかった場合は最新のバージョンの値を取得することができます。
次にデータをdeleteしてみます。
$ delete "tbl", "row1", "fam:col1" 0 row(s) in 0.0200 seconds
データを取得してみると削除されていることが分かります。
$ get "tbl", "row1", "fam:col1" COLUMN CELL 0 row(s) in 0.0230 seconds
ちなみに、Columnが複数ある場合にRowをまるごと削除したい場合はdeleteallを使用します。
$ deleteall "tbl", "row1" 0 row(s) in 0.0230 seconds
最後にscanを試してみましょう。
まずは、以下のようにデータを入れます。
$ put "tbl", "row1", "fam:col1", "val1" 0 row(s) in 0.0170 seconds $ put "tbl", "row1", "fam:col2", "val2" 0 row(s) in 0.0170 seconds $ put "tbl", "row2", "fam:col1", "val3" 0 row(s) in 0.0190 seconds $ put "tbl", "row3", "fam:col1", "val4" 0 row(s) in 0.0190 seconds $ put "tbl", "row4", "fam:col1", "val5" 0 row(s) in 0.0190 seconds
scanを実行して全データを取得してみます。
$ scan "tbl" ROW COLUMN+CELL row1 column=fam:col1, timestamp=1357045614868, value=val1 row1 column=fam:col2, timestamp=1357045619579, value=val2 row2 column=fam:col1, timestamp=1357045624980, value=val3 row3 column=fam:col1, timestamp=1357045628986, value=val4 row4 column=fam:col1, timestamp=1357045633027, value=val5 4 row(s) in 0.0290 seconds
LIMITを指定すると、取得するRow数を限定できます。
$ scan "tbl", {LIMIT => 2} ROW COLUMN+CELL row1 column=fam:col1, timestamp=1357045614868, value=val1 row1 column=fam:col2, timestamp=1357045619579, value=val2 row2 column=fam:col1, timestamp=1357045624980, value=val3 2 row(s) in 0.0320 seconds
次に、RowKeyの範囲(STARTROWやSTOPROW)を指定してデータを取得してみます。STOPROWに指定したRowKeyは含まれないことに注意してください。
$ scan "tbl", {STARTROW => "row2"} ROW COLUMN+CELL row2 column=fam:col1, timestamp=1357045624980, value=val3 row3 column=fam:col1, timestamp=1357045628986, value=val4 row4 column=fam:col1, timestamp=1357045633027, value=val5 3 row(s) in 0.0400 seconds $ scan "tbl", {STOPROW => "row3"} ROW COLUMN+CELL row1 column=fam:col1, timestamp=1357045614868, value=val1 row1 column=fam:col2, timestamp=1357045619579, value=val2 row2 column=fam:col1, timestamp=1357045624980, value=val3 2 row(s) in 0.0300 seconds scan "tbl", {STARTROW => "row2", STOPROW => "row4"} ROW COLUMN+CELL row2 column=fam:col1, timestamp=1357045624980, value=val3 row3 column=fam:col1, timestamp=1357045628986, value=val4 2 row(s) in 0.0450 seconds
最後にFilterを使ってみます。
以下では、TimestampsFilterを使って、timestampが1357045624980のColumnを取得しています。
$ scan "tbl", {FILTER => "TimestampsFilter (1357045624980)"} ROW COLUMN+CELL row2 column=fam:col1, timestamp=1357045624980, value=val3 1 row(s) in 0.0250 seconds
まとめ
今回はHBaseの概要を簡単に解説し、HBaseを実際にひと通り動かしてみました。次回はHBaseのもう少し詳細なアーキテクチャについて解説したいと思います。そして、その後はHBaseを使って実際にアプリケーションを作成していく予定です。
また、株式会社サイバーエージェントでは、Hadoop/HBaseエンジニアを募集しています。ご興味のある方はこちらからエントリーしていただければと思います。エンジニア>R&Dエンジニア>R&Dエンジニアを選択しエントリーしていただければ幸いです。