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です。

データはTableRowColumnの形で論理的に編成されます。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:"を付け加えた図です。
Hb1.png

実ファイル図

概念図上では虫食い状態のRowの集まりがTableとして見えましたが、実File上ではColumnFamilies毎に分かれて保存されています。
Hb2.png

概念図上で空白として表されているデータが空の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つの構成要素を持っています。

  1. HBaseMaster・・・BigTable MasterServerに相当
  2. HRegionServer・・・BigTable TabletServerに相当
  3. HBase Client(org.apache.hadoop.hbase.client.HTable)

それぞれ続く章で詳細に解説します。

参考


HBaseの構造(概要とDataModel)     >>     HBaseの構造(Server構成)

大項目
案内
ツールボックス