TOP Database
&aname(自動シャーディング)
停止
バージョン数を指定しなかった場合は最新のバージョンの値を取得
CAPはConsistency(一貫性)、Availability(可用性)、Partition-tolerance(分断耐性)の頭文字をとったもの
分散システムにおいてこの3つを同時に満たすことはできないという定理
==>定理の本質はPartition-toleranceを担保すると同時に、ConsistencyとAvailabilityの両方を満たすことはできない
==>HBaseは、ConsistencyとPartition-toleranceをとったCP型のデータベース
分散システムにおいてこの3つを同時に満たすことはできないという定理
==>定理の本質はPartition-toleranceを担保すると同時に、ConsistencyとAvailabilityの両方を満たすことはできない
==>HBaseは、ConsistencyとPartition-toleranceをとったCP型のデータベース
Consistency | データの更新があった場合にすべてのクライアントは同じデータが見えること |
Availability | ノードに障害が発生した際に、すべてのクライアントはデータのいくつかの複製を発見することができること |
Partition-tolerance | 分散システムのネットワークが切断されてもサービスを継続することができること |
HBaseでは、HMasterとHRegionServerという2種類のプロセスが存在
HMaster | マスタとなりHRegionServerの管理やコーディネーションを行う |
HRegionServer | クライアントと実際にデータのやりとりを行う |
- データのやりとりに関してはHMasterを経由することはないので、HMasterがボトルネックになることはない
- HMasterはホットスタンバイを立てることができて自動フェイルオーバーが可能
多次元ソートマップ
- Tableという概念が存在
- Tableには複数のRowが存在(RowKeyで一意に特定)
- Rowには1つ以上のColumnが存在(すべてのRowは、RowKeyを使って常に辞書の順にソートされている)
- Columnはテーブル作成時に定義する必要がなく、後から自由に追加する可能
- Tableには1つ以上のColumnFamilyが存在
- ColumnはいずれかのColumnFamilyに所属することになる
- ColumnFamilyはテーブル作成時に定義する必要がある
- それぞれのColumnには、複数のバージョン(基本的にはTimestampで管理)を持たせることができ、バージョンごとに値(Value)を持つことができる
- 列指向のストレージフォーマットを採用(ColumnFamilyごとにファイルを分けてディスクに保存)
- データはRowKeyの範囲でファイルを分割(RowKeyの範囲で分割された単位をRegionと呼ぶ。Regionが各HRegionServerに割り当てられ負荷を分散)
- RowKey,ColumnFamily,Column,Timestamp,Valueがセットで格納される
- 同じRowで複数のColumnの値が存在する場合は、同じRowKeyのエントリーが複数存在(Columnも辞書順でソートされて格納される)
- 値がNULLであるColumnを保存しない
- バージョンは、RowKeyやColumnが同じでTimestampのみが違うエントリーとして管理
Hadoop
- Hadoop分散ファイルシステム(HDFS)上に構築
- HDFSに保存されたデータはレプリケーションされる
- HBaseはHDFSクライアントを用いてレプリケーションなどを意識せず透過的にファイルアクセスを行う
- HDFSにはNameNodeとDataNodeというプロセスがある(NameNodeがマスタとするマスタ型のアーキテクチャ)
- NameNodeが単一障害点になってしまうという問題はHadoop HAというソリューションにより、NameNodeのホットスタンバイを立て解決
- RowKeyによるレンジスキャンが可能(RowKeyでソートされた状態でデータが保存されているので)
- フィルタを用い取得する必要のないRowをスキップできるため、スキャンの効率を大幅に高めること
- 独自のフィルタを作成することも可能
&aname(自動シャーディング)
- 強い一貫性を持ち、古いデータが見えることはない
- Rowに関する操作はアトミックに行われる(Rowに関する操作についてはコミットやロールバックに近いことが可能)
- 値のインクリメントやCAS操作が可能
- RDB(SQL etc)で扱いきれないような大規模なデータを扱う場合
- 自動シャーディングによって負荷が分散
- HRegionServerを増設することで性能をスケールする
- 運用面でメリット
- 障害時に自動的にフェイルオーバーされる
- HBaseをスタンドアロンモードで動かす場合、HDFSをインストールせず、HBaseのみインストール
- HBaseをインストールする前にJavaのインストールが必要(HBaseはJava6に依存.Java7は不可)
$ tar -zxvf hbase-0.94.3.tar.gz $ cd hbase-0.94.3 $ export JAVA_HOME=<Javaのインストールパス>起動
$ bin/start-hbase.sh起動したら、http://localhost:60010/master-statusにアクセス
停止
$ bin/stop-hbase.sh
putの第1引数はTable、第2引数はRowKey、第3引数はColumnFamily:Column、第4引数は値を指定
$ put "tbl", "row1", "fam:col1", "val1"
$ get "tbl", "row1", {COLUMN => "fam:col1", VERSIONS => 2}HBaseではColumnに対して複数のバージョン(デフォルトで3)を持つことができる
バージョン数を指定しなかった場合は最新のバージョンの値を取得
$ put "tbl", "row1", "fam:col1", "val1" $ put "tbl", "row1", "fam:col2", "val2" $ put "tbl", "row2", "fam:col1", "val3" $ put "tbl", "row3", "fam:col1", "val4" $ put "tbl", "row4", "fam:col1", "val5" $ scan "tbl"
STOPROWに指定したRowKeyは含まれない
$ scan "tbl", {STARTROW => "row2"} $ scan "tbl", {STOPROW => "row3"} $ scan "tbl", {STARTROW => "row2", STOPROW => "row4"}
TimestampsFilterを使って、timestampが1357045624980のColumnを取得
$ scan "tbl", {FILTER => "TimestampsFilter (1357045624980)"}
最新コメント