SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

初めてのHBase

HBaseのアーキテクチャを理解しよう

初めてのHBase 第2回

Compactionについて

 Flushが何度も行われると、HFileの数が増加していき、読み込みが非効率になっていきます。そこでHBaseは、Compactionという複数のHFileをまとめて1つのHFileにするという処理を行います。

 Compactionは、メジャーマイナーの2つの種類があります。

  • マイナーCompaction:新しいいくつかのHFileを1つのHFileにまとめる処理をします
  • メジャーCompaction:すべてのHFileを1つのHFileにまとめる処理をします

 メジャーCompactionの際には、不必要なバージョンを削除したり、前述した削除マーカーとともに実際のデータも消します。

 また、HBaseでは、ColumnFamily内のValueに対してTTL(Time to Live,生存期間)を設定することができますが、メジャーCompactionの際にはTTLが過ぎたデータも削除します。

 以下、Compactionのイメージ図になります。

 HFileはすでにRowKey+ColumnFamily+Column+Timestampでソートされているので、実際にマージする際には、各HFileを先頭から読み出しながら行います。

Splitについて

 特定Regionのデータ量が増えていくと、Region間でのデータ量やアクセスの偏りが発生する可能性があります。この偏りを防ぐために、HBaseは大きくなったRegionの分割を行います。これをSplitと呼びます。

 各HRegionServerで担当Regionのサイズをモニタリングし、ある一定以上のサイズになるとそのRegionをちょうど半分に分割します。

 これにより、各HRegionServer間でRegion数に差がでた際に、Balancerにより多くRegionを割り当てられているHRegionServerから、別のHRegionServerにRegionを割り当て直します。

 このようにすることで、各HRegionServer間でのデータ量やアクセスを均一に保とうとしています。

HBaseの読み込みフロー

 それでは、HBaseの読み込みについて見ていきましょう。

 書き込みフローで説明した通り、データはまずメモリ上のMemStoreに書き込まれ、一定サイズを超えるとHFileとしてFlushされるということを繰り返します。つまり、読み込みたいデータはMemStore、あるいは複数あるHFileのどこにあるのか分からないということになります。

 そこで、HBaseにおけるデータの読み込み時には、基本的にすべてのHFileをすべて読み込む必要(※1)があります。HBaseは書き込みが速い分、読み込みが多少遅くなるアーキテクチャになっています。

 以下、読み込み時の簡単なイメージ図になります。

 MemStoreやHFileは、RowKey+ColumnFamily+Column+Timestampでソートされているので、MemStoreや各HFileの先頭から読み出していき必要なエントリーだけを取り出していくという処理になります(※2)。

 上のイメージ図の例では、startRowは"row2"、stopRowは"row4"(stopRowは含まれない)の範囲で、かつVersionが1(最新のみ)でscanしています。

 MemStoreや各HFileの先頭から読み出していき、startRowかもしくはそれより大きいRowKeyのRowを探索し、それぞれのデータを比べ最新のものだけを返しています。そして、stopRowもしくはそれより大きいRowKeyのRowまで進んだ所で探索を終了します。

※1

 実際には、Bloom Filterやタイムスタンプを用いて読み込む必要のあるHFileを選別することができます。また、Block Cacheという機構を使ってキャッシュをしているので、毎回HFileにアクセスしているわけではありません。

※2

 実際には、HFile内にインデックスがあり、明らかに読み込む必要のないエントリーをスキップすることができます。

コラム

 なぜ、HBaseはこのような構造になっているのでしょうか。

 HBaseのベースとなっている考え方にLSM-tree(Log-Structured Merge-tree)があります。

 前提として、大規模なデータを扱う場合にはディスクの転送に占める時間はかなり大きいものになります。

 一般的なRDBではB+treeがよく使われていますが、ディスクのシークがLSM-treeに比べて多く発生します。対して、LSM-treeではシークがあまり発生しないので、ディスクの転送量をフルに使って処理を行うことができます。

 大規模環境では、後者の方が効率的なので、HBaseでは後者のアプローチをとっています。

HBaseの耐障害性

 ここまで、WALやHFileの書き込みは"ファイルシステムへ"という表現をしてきました。

 HBase自体にはデータの耐障害性に関する機能はなく、下位のファイルシステムに依存しています。下位のファイルシステムには通常はHadoop分散ファイルシステム(以下、HDFS)を使用します。

 HDFSについては、本連載から外れた内容のため詳しい説明はしませんが、デフォルトで3つのレプリカを持つことでデータの耐障害性を高めています。

 各HRegionServerからHDFSに書き込まれたWALやHFileは、HMasterや他のHRegionServerからも読み込むことができるので、あるHRegionServerがダウンしたとしても他のHRegionServerにフェイルオーバできます。

 また、HDFSではデータのローカリティも考慮されています。各HRegionServerで書き込まれたデータのレプリカの一つは必ずローカルにあるので、ネットワークを介さずにアクセスできます。

まとめ

 今回は、HBaseのアーキテクチャについて解説しました。次回からは、実際にHBaseを使ってアプリケーションを作っていきます。

 また、株式会社サイバーエージェントでは、Hadoop/HBaseエンジニアを募集しています。ご興味のある方はこちらからエントリーしていただければと思います。エンジニア>R&Dエンジニア>R&Dエンジニアを選択しエントリーしていただければ幸いです。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
初めてのHBase連載記事一覧

もっと読む

この記事の著者

鈴木 俊裕(スズキ トシヒロ)

株式会社サイバーエージェント アメーバ事業本部 Ameba Technology Laboratory 2008年4月に株式会社サイバーエージェントに新卒で入社。基盤システムの開発・運用に従事する。 2010年4月にHadoop/Hiveを用いたログ解析基盤の開発・運用を担当する。 2011年4月に、ログ解析、レコメンド、検索エンジンなどを開発するAmeba Technology Laboratoryの立ち上げメンバーとなる。 2011年10月からHBaseを用...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7017 2013/03/05 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー