HBase入門 | Hadoop Advent Calendar 2016 #22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。 この記事はHadoop Advent Calendar 20日目のものとなります。

前回はIbisについて書かせていただきました。
今回はHBaseについて書かせていただきます。

HBaseとは

HBaseの構成

HBaseはデータを格納するために、HDFSが利用できるNoSQLです。
複数台の分散環境で処理を行うことによって通常のRDBでは扱いきれないようなサイズのデータに対してランダムアクセスを含めて高速に読み書きすることを可能にしています。
MasterサーバとRegionサーバで構成され、Regionサーバを増やすことでスケールさせることが可能になっています。

hbase

MasterサーバはRegionサーバへのリージョン割り当てや障害時の復旧などを担当します。 リージョンに関する情報は、Zookeeperとものに書き込まれるため、クライアントはMasterサーバを経由することなくRegionサーバに直接データを取りに行きます。
また、分散環境にデータが保持されますが、書き込みの終了後は古いデータにアクセスすることはないなどの整合性が保証されます。

HBaseのデータ構造

HBaseのデータ構造は下の図のようになります。

hbase2

各データは行のkeyとなる値でソートされて保持しています。 列方向は『列ファミリ > 列』と階層化されています。
これらのデータに対して、行の一定の範囲ごとで区切ってシャーディングされたデータが列ファミリごとのまとまりで1つのファイルとして保持されるという構造になっています。
列ファミリはテーブルのスキーマとして定義されている必要がありますが、その中の列の追加などは自由に行えます。

使ってみる

さて、簡単な概要はご理解いただけたかと思います。 データベース周りの話を深いところまでやろうと思うと、難しい理論なども絡んでくるため細かいことはさておき実際に使ってみましょう。

インストール

今回は簡単に手元の環境で動かしてみることにします。 インストールはMacであればhomebrewで行えます。

brew install hbase

インストールしたのち、起動してシェルを立ち上げてみます。

start-hbase.sh
hbase shell
hbase(main):001:0> 

シェルから使って見る

まずは、列ファミリを指定して、テーブルの作成を行います。

hbase(main):001:0> create 'test', 'cf'
hbase(main):001:0> list
TABLE                                                                                                                                                                                                   
test                                                                                                                                                                                                    
1 row(s) in 0.0140 seconds

=> ["test"]

作成したテーブルが表示されているのがわかります。

次にデータを入れて確認してみます。 putで挿入、getで取得、scanで全件確認ができます。

hbase(main):020:0> scan 
Display all 486 possibilities? (y or n) 
hbase(main):020:0> scan 'test'
ROW                                                 COLUMN+CELL
 row1                                               column=cf:a, timestamp=1481872232581, value=value1
 row2                                               column=cf:b, timestamp=1481872252549, value=value2
2 row(s) in 0.0360 seconds

hbase(main):021:0> put 'test', 'row2', 'cf:b', 'value2.1'
0 row(s) in 0.0050 seconds

hbase(main):022:0> scan 'test'
ROW
  row1                                               column=cf:a, timestamp=1481872232581, value=value1
  row2                                               column=cf:b, timestamp=1481872303810, value=value2.1
2 row(s) in 0.0240 seconds

hbase(main):036:0> get 'test', 'row2'
COLUMN                                              CELL
 cf:b                                               timestamp=1481872303810, value=value2.1
1 row(s) in 0.0210 seconds

Javaから使ってみる

最後にシェルで作成たテーブルに対して、Javaを使って値を取得する方法を見てみましょう。 簡単なメインメソッドを持つプログラムを作成します。

public class HBaseClient {
  public static void main(String[] args) throws Exception{
    // 設定を取得
    Configuration conf = HBaseConfiguration.create();

    // table名を指定してtableを取得
    HTable table = new HTable(conf, "test");

    // 行を指定指定して取得
    Get g = new Get(Bytes.toBytes("row1"));
    Result result = table.get(g);
 
    // 値のリストを       
    List<Cell> cells = result.listCells();
    
    // 列名を取得
    String value = new String(CellUtil.cloneRow(cells.get(0)));
    System.out.println(value);

    // 値を取得
    String row = new String(CellUtil.cloneValue(cells.get(0)));
    System.out.println(row);
  }
}

このプログラムをコンパイルするためには、hbase-clientを依存に含めます。

<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-client</artifactId>
  <version>1.2.2</version>
</dependency>

ビルド・実行して以下のような結果になれば成功です。

row1
value1

終わりに

今回はHBaseの基本的な仕組みと簡単な使い方について書かせていただきました。 実際のデータサイズでどのくらいの速度ど動くかなどは簡単に数行のデータを入れてみた程度ではわからないかと思いますが、基本的な使い方はご理解いただけたかと思います。

明日はHueというWebUIでHadoopを操作可能なものについて書かせていただく予定です。
ぜひ、お楽しみに!