HBase入門 | Hadoop Advent Calendar 2016 #22
こんにちは、小澤です。 この記事はHadoop Advent Calendar 20日目のものとなります。
前回はIbisについて書かせていただきました。
今回はHBaseについて書かせていただきます。
HBaseとは
HBaseの構成
HBaseはデータを格納するために、HDFSが利用できるNoSQLです。
複数台の分散環境で処理を行うことによって通常のRDBでは扱いきれないようなサイズのデータに対してランダムアクセスを含めて高速に読み書きすることを可能にしています。
MasterサーバとRegionサーバで構成され、Regionサーバを増やすことでスケールさせることが可能になっています。
MasterサーバはRegionサーバへのリージョン割り当てや障害時の復旧などを担当します。
リージョンに関する情報は、Zookeeperとものに書き込まれるため、クライアントはMasterサーバを経由することなくRegionサーバに直接データを取りに行きます。
また、分散環境にデータが保持されますが、書き込みの終了後は古いデータにアクセスすることはないなどの整合性が保証されます。
HBaseのデータ構造
HBaseのデータ構造は下の図のようになります。
各データは行の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を操作可能なものについて書かせていただく予定です。
ぜひ、お楽しみに!