はじめに
HBaseのアーキテクチャについて知ることは、HBaseを使ってアプリケーションを設計するためにとても重要なことです。RDBとは違う部分が多いので最初は理解しにくいかもしれませんが、できるだけ分かりやすく解説していきたいと思います。
対象読者
- HBaseを使ってみたいけど、どう使ったらよいか分からない方
- MySQLなどのRDB以外のデータベースを使ってみたい方
HBaseのデータモデルについてのおさらい
前回もHBaseのデータモデルについて説明しましたが、最初に簡単にデータモデルのおさらいをします。
以下、前回の論理データモデルの説明を箇条書きでまとめたものになります。
- 多次元ソートマップ
Table = SortedMap<RowKey, Map<ColumnFamily, SortedMap<Column, SortedMap<Timestamp, Value>>>>
- Tableがあり複数のRowがRowKeyによって一意に特定される
- すべてのRowはRowKeyによって辞書順にソートされている
- Rowには1つ以上のColumnが存在する
- Tableには1つ以上のColumnFamilyが存在し、ColumnはいずれかのColumnFamilyに所属する
- ColumnFamilyはテーブル作成時に定義する必要があるが、Columnは後から自由に追加できる
- それぞれのColumnには、複数のバージョン(基本的にはTimestampで管理)を持たせることができる
論理的には上記のようなモデルですが、物理的には以下のようにファイルに分割されディスクに格納されます。
- RowKeyの範囲でファイルが分割される(Region)
- さらに、ColumnFamilyごとにファイルを分けてディスクに保存される
- Regionごとに各HRegionServerに割り当てられ負荷が分散される
先ほど示した図の例の場合、以下のようにファイルが分割されることになります。
ただし、HRegionServerにはRegionの単位で割り当てられるので、同じRegionであれば複数のColumnFamilyがあっても同じHRegionServerに割り当てられます。
それぞれのファイルでは、以下のように格納されています。
- 各エントリーはRowKey,ColumnFamily,Column,Timestamp,Valueがセットで格納されている
- RowKey+ColumnFamily+Column+Timestampでソートされている
- 同じRowでも複数のColumnの値が存在する場合は、同じRowKeyのエントリーが複数存在している
- 値がNULLであるColumnを保存しない
- バージョンに関しては、RowKeyやColumnが同じでTimestampのみが違うエントリーとして管理されている