HBaseの構造(概要とDataModel)
提供: LunaBiblos
Software > DataBase > KeyValueストア > HBaseの構造(概要とDataModel)
HBaseの構造(概要とDataModel) >> HBaseの構造(Server構成)
目次 |
概要
HBaseの構造を理解する為にも事前にGoogle BigTableの論文を読んでおく事をお勧めします。
Google BigTableがGoogle Distributed Filesystem(GFS)を利用してDataStorageを実現している様に、HBaseはHadoop分散処理環境下でBigTableと同様の機能を搭載する事を目的としてApache OpenSource Projectです。
データはTable、Row、Columnの形で論理的に編成されます。RowはIteratorの様に利用する事も出来ますし、勿論特定のKeyに紐付いたデータだけを取得する事も出来ます。基本的にどのColumnでも、特定のKeyに紐付いたデータとその過去のデータをVersionという形で保持する事も出来ます。
特性
HBaseは従来のRDBと同じでStrong Consistencyを採用して居ます。
またDataの方はシャーディング型で分割されて居ます。
HBaseは、Wikipediaの自然言語検索Engineを主目的として開発されたので、HTMLとそれに関連するタグ情報といった「非定型のデータ」に強く、規模としては数十億レコード規模の「大規模なデータセット」といった条件で最高の性能を発揮します
また追加機能として2次Indexや楽観的Lock方式のTransactionを利用する事も出来ます。
データ構造
HBaseのデータ構造はやはりBigTableに似た物と成っています。
HBaseは名前の付いたTableに、Rowと呼ばれる従来のRDBでいうRecordに相当する形式でデータを保存します。各データはKeyと任意の数のColumnを持っており、Key順に並べられて保持されています。また同一のTableでも保持するColumnの数が大きく変化する為にTableはまばらな状態で蓄えられます。
Columnの名称は"<Family>:<Label>"という形式になっており、<Family>と<Label>とで任意の大きさのByteArrayになっています。Table側からみると同じ<Family>を持つデータの集まりはColumnFamiliesとい云う形で管理されます。
ColumnFamiliesの構成を変更する事、つまり一個のTableに新たにFamilyを追加する際はTableの設定を変更する操作が必要になります。一方<Label>の追加はその様な制限無くデータ登録時に自由に新しい<Label>を作って利用する事が出来ます。HBaseはColumnFamiliesの構造に近い形で実ファイルを作りデータを保存する為、同じColumnFamiliesの中にあるデータは同時に読み書きされる事になるので同じColumnFamiliesの元に入るDataの特性は用途はそろえておいた方が得策です。
データ操作を行う際、標準では1RowのみがLock対象と成ります。Rowは常にAtomicに書き込まれますが一個のRowをLockした状態で読み書きを同時にAtomicに行う事も可能です。最近になり同時に複数行をLock出来る機能が追加されましたが、HBaseの標準状態では利用されないので、利用する場合は設定を変更する必要があります。
概念図
概念的に、HBaseのTableはRowの集まりだと考える事が出来ます。下図はBigTableの元に新たな<Family>である"mine:"を付け加えた図です。
実ファイル図
概念図上では虫食い状態のRowの集まりがTableとして見えましたが、実File上ではColumnFamilies毎に分かれて保存されています。
概念図上で空白として表されているデータが空のCellはColumn指向Storageの特性として、実ファイルには保存されて居ません。その為に"contents:"ColumnのTimestamp"t8"の値を取得しようとしても、値は何も返ってきません。同じように"anchor:my.look.ca"ColumnのTimestamp"t9"の値も取得する事は出来ません。
所でTimestamp指定を行わずにとあるColumnに含まれる値の取得を試みた場合、最新の値が返ってきますが、これはそのColumnがもつ値をTimestampの降順に並べその一番上に来るTimestampを持つ値を返しているのです。
もしTimestampの指定を行わずにKeyが"com.cnn.www"であるRowの全Columnの値の取得を試みた場合、"contents:"ColumnのTimestamp""t6から、"anchor:cnnsi.com"のTimestamp"t9"から、"anchor:my.look.ca"のTimestamp"t8"から、"mime:"ColumnのTimestamp"t6"から、それぞれ値が返ってきます。
一定範囲で区切られたRowの塊:Regions
HBaseのTableはRowKeyの昇順、Column名の昇順、Timestampの降順の順で並べられたRowの塊に見えますが、実際は一定範囲毎にRowを区切り、Region(BigTableのTabletに相当)と呼ばれるファイルの形で保存されています。Regionは先頭Key(実ファイル含む)から末尾Key(実ファイル含まず)を含んでおり、適切な順で並べられたRegionファイルが、一個のTableに相当します。
BigTableとの違いとして、BigTableはTable名と末尾KeyでRowの範囲を区切りを特定するのに対し、HBaseではTable名と先頭Keyで区切りの特定を行います。
HStore
Regionファイルの内部で各ColumnFamilyはHStoreとして保存されており、GoogleでいうSSTableに相当する一個以上のMapFileで構成されている。このMapFileは一度作られたら改変される事はない。
構造と動作仕様
HBaseは大きく分けると3つの構成要素を持っています。
- HBaseMaster・・・BigTable MasterServerに相当
- HRegionServer・・・BigTable TabletServerに相当
- HBase Client(org.apache.hadoop.hbase.client.HTable)
それぞれ続く章で詳細に解説します。
参考
HBaseの構造(概要とDataModel) >> HBaseの構造(Server構成)