Apache HBase アーキテクチャ
Apache HBase Architecture
Apache HBase は NoSQL データベースである。NoSQL は、データベースが SQL を基本アクセス言語としてサポートする RDBMS ではないことを示す一般的な表現である。Apache HBase は、従来の意味でのデータベースというよりデータストアである。HBase はクラスタに汎用ノードを追加することで、線形かつモジュール式に拡張できる。ノードを 20 個から 40 個に増やすと、HBase クラスタのストレージと容量も同時に増加する。
HBase クラスタアーキテクチャ

Apache HBase の構成要素
HBase は Master server と Region server の 2 種類のサーバーで構成される。
Region server を増設することで簡単にスケールアウトできる構造になっている。
HBase のデータは Region という単位に分割されており、Region の扱い方によってサーバーの種類が分かれる。
Master server - HBase HMaster
Apache HBase HMaster は、RegionServer の監視、障害処理、Region 分割管理を担当する HBase クラスタの重要な構成要素である。
各テーブルのデータは RegionServer が管理し、クラスタ全体は HMaster が管理する。
HMaster は、HBase のすべてのデータ (Region) がどの Region server に保存されているかというメタ情報を管理するサーバーである。
Region server に Region を割り当て、Region server の障害を検知する。
HMaster の機能は次のとおりである。
- RegionServer を監視する。
- Region server を調整する。
- Region の起動を管理する。
- RegionServer の failover を処理する。
- Region を割り当て、または解除する。
- クラスタ内のすべての Region server を監視する。
- 管理機能。
- テーブルの作成、削除、更新。
- メタデータ変更を処理するために使用される。
- すべてのメタデータ変更に対するインターフェースを提供する。
- アイドル時間にリバランシングを実行するために使用される。
- HMaster は HBase クラスタに関する情報を表示する Web ユーザーインターフェースを提供する。

これらの作業は、Master server 内で動作している ZooKeeper というソフトウェアが担当している。
ZooKeeper は HBase 以外にも多くの分散アプリケーションで使用されるソフトウェアである。
Region server - HBase Region Server
RegionServer は、Master server から割り当てられた実データの保存を担当する。Hadoop クラスタと同じように、NameNode はメタデータを保存し、DataNode は実データを保存する。HBase でも同様に、Master はメタデータを保持し、RegionServer は実データを保存する。RegionServer は分散クラスタ環境の DataNode 上で実行される。
RegionServer は次の作業を行う。
- 割り当てられた regions (tables) を処理する。
- クライアントが実行する読み取りおよび書き込み要求を処理する。
- キャッシュを HDFS に flush する。
- Region 分割処理を担当する。
- HLog を維持管理する。
クライアントはまず Master server、正確には ZooKeeper に問い合わせ、対象データ (Region) を保持している Region server の位置を取得する。
その後、その Region server がクライアントの要求を担当する。
Region は常に単一の Region server によって管理され、読み取りと書き込みに対するデータ一貫性を維持する。
Region server が down すると、割り当てられていた Region は別の Region server に failover される。この作業は Master server が実行する。
ただし、failover が完了するまで、クライアントは対象 Region に対して読み書きできない。

RegionServer の構成要素
RegionServer の構成要素を見てみる。
WAL (Write-Ahead Logging)
WAL とは、データ整合性を保証する標準的な方法であり、DB で使用される方式である。WAL を使用するシステムでは、データを修正する前にまず WAL に記録する。この記録を利用して、どの時点で障害が発生したか、どこまで成功し、どこから後続作業を実行すべきかを知ることができる。
PostgreSQL、HBase、MongoDB など、さまざまな DB システムで WAL 方式が使用される。
Apache HBase WAL は、編集ログファイルとも呼ばれる中間ファイルである。HBase でデータを読み取ったり修正したりするとき、ディスクに直接書き込むのではなく、一定時間メモリに保持する。そのため、システムが down するとメモリ上のデータが失われる可能性がある。この問題を克服するため、Apache HBase はデータをメモリに記録する前に、まず Write-Ahead Logging ファイルに記録する。
HFile
HFile は HBase にデータを保存するためのフォーマットであり、Column Family に属する。Column Family は複数の HFile を持つことができる。
Row データが物理的に保存される実ファイルであり、データは Key/Value 形式で保存される。
MemStore が十分に満たされると、HDFS に新しい HFile を作成して保存する。
ランダムアクセスを最小化する構造のため、この処理は非常に高速に行われる。
Store
HBase のテーブルに対する Column family に該当する。ここに HFile が保存される。
MemStore
MemStore はメインメモリに常駐し、現在のデータ操作を記録する。データが WAL に保存されると、Region Server のメモリストアに key/value データをソートして保存する。このデータをそのまま HFile に保存する。 1 つの Column Family ごとに 1 つの MemStore が存在する。
Region
Region は、key を基準に分割され、RegionServer でホストされるテーブルの分割単位である。
クライアント
クライアントは Java またはその他の言語で作成でき、外部 API を使用して実際の row データを管理する RegionServer に接続できる。クライアントは Region を探すために catalog table に問い合わせ、Region が見つかると、RegionServer に直接接続してデータ操作を実行し、高速検索のためにデータをキャッシュする。
Catalog table
Catalog table は、すべての RegionServer および Region に関するメタデータを維持するために使用される。
HBase には 2 種類の catalog table がある。
- -ROOT- このテーブルには META テーブルの位置に関する情報がある。
- .META このテーブルにはすべての Region とその位置に関する情報が含まれている。
ZooKeeper
Apache ZooKeeper は HBase のコーディネータのようなものである。HBase は ZooKeeper を利用して、クラスタを構成するサーバーの状態を管理する。 構成情報の維持、命名、分散同期の提供、サーバーエラー通知などのサービスを提供する。クライアントは ZooKeeper を通じて Region server と通信する。
Apache ZooKeeper は、HBase に分散同期とグループサービスを提供する分散アプリケーション向けの高性能な集中型多重調整サービスシステムである。クラスタ調整を担いながら、ユーザーがアプリケーションロジックに集中できるようにする。また、ユーザーが Master server と連携できる API も提供する。
Apache ZooKeeper API は、一貫性、順序付け、耐久性を提供し、分散クラスタシステムに対する同期と同時実行性も提供する。
HBase データの書き込み/読み取りプロセス
HBase でデータを読み書きする過程について説明する。
HBase データ書き込み
HBase でデータを保存するときは、WAL (Write Ahead Log) と Region server の MemStore の 2 か所にデータを保存する。
この 2 つを利用し、WAL と MemStore の両方で変更が発生した時点で書き込み処理が正常に完了したことになる。
HBase にデータ投入要求が来ると、まず適切な Region server を探す。Region server を見つけると Commit log を追加し、メモリ内の MemStore に追加される。
MemStore に保存されていたデータは、設定された値に従っていっぱいになると HFile という形式でディスクに flush され、メモリを空けて再び要求を待つ。同時に WAL にもこれに関する記録を残す。
MemStore flush は hbase.hregion.memstore.flush.size の値を超える場合に発生し、単位は byte で 134217728 (128 MB) に設定されている。
MemStore は Region server のメモリ領域であり、キャッシュのような機能を持つ。
そして、MemStore のデータが一定量集まった時点で、ディスク上に HFile としてデータを書き出して永続化する。
ただし、HFile に書き出す前のデータはサーバーのメモリ (MemStore) に保存されているため、サーバーが down すると消える。
そのため、HBase はデータを書き込むときに HLog というログを残し、サーバーが down した場合は HLog をもとにデータを復旧できる。
HBase データ読み取り
HBase でデータを読み取る過程は、前述した HBase データ書き込み過程と似ている。
HBase に要求が入ると、まず MemStore を確認する。MemStore で目的のデータを見つけると、そのデータを返す。 そうでない場合は、最近 flush されたファイルから古い順に、クエリを満たす適切なデータを見つけるか、これ以上 flush ファイルがなくなるまで繰り返す。