1. ホーム
  2. データベース
  3. その他のデータベース

Hbaseカラムナーストレージ入門チュートリアル

2022-01-17 21:41:44

HBaseは、大規模なデータ保存をサポートする分散型、スケーラブル、NoSQLデータベースです。HBaseはHDFSを使用してデータを下部に保存するため分散型であり、HDFSの水平方向の拡張性によりスケーラブルである。ビッグデータ用のストレージとして、確かに大量データの保存をサポートしており、NoSQLの非リレーショナルデータベースのテーブル構造は、リレーショナルデータベース(Mysqlなど)の論理的・物理的構造とは大きく異なり、機能の性質や適用シーンが異なる。

1. 論理構造

1)名前空間

HBaseにはhbaseとdefaultという2つの自己完結した名前空間があり、hbaseはHBaseの組み込みテーブルを保持し、defaultはユーザーがデフォルトで使用する名前空間である。

2) 地域

リレーショナル・データベースにおけるテーブルの概念に似ている。違いは、HBaseはテーブルを定義する際に、特定のカラムではなく、カラムファミリーを宣言すればよいことである。つまり、HBaseにデータを書き込む際に、フィールドを動的かつオンデマンドに指定することができる。その結果、HBaseはリレーショナルデータベースと比較して、フィールドの変更シナリオを容易に扱うことができる。

3) 行

HBaseテーブルの各データ行は RowKey と複数の (カラム)の辞書順に格納され、クエリ時にはRowKeyを元にしかデータを取得できないため、RowKeyの設計は非常に重要である。

4) カラム

HBaseの各カラムは、info:nameやinfo:ageのようにカラムファミリとカラムクオリファイアで修飾される。テーブルを構築する際には、カラムファミリを指定するだけでよく、カラムクオリファイアは事前に定義する必要はない。

5) タイムスタンプ

このフィールドは、データの異なるバージョンを識別するために使用されます。各データが書き込まれたとき、タイムスタンプが指定されていなければ、自動的にこのフィールドに追加され、その値はHBaseに書き込まれた時刻となる。

6) セル

rowkey, column Family: column Qualifier, time Stamp}で一意に識別されるセル。セルは型付けされておらず、すべてのデータはバイトコード形式で保存される。

2. 物理構造

1) リージョンサーバー

Region Server は Region の管理者であり、その実装クラスは HRegionServer で、主な役割は以下の通りです。

2) マスター

マスターはすべてのリージョンサーバの管理者であり、その実装クラスは HMaster で、以下の主な役割を持ちます: テーブル操作:作成、削除、変更 リージョンサーバ操作:各リージョンサーバへのリージョン割り当て、各ステータスの監視 HMaster の主な役割: テーブル操作:作成、削除、変更

3) Zookeeper

HBaseはZookeeperを使って、Masterの高可用性、RegionServerの監視、メタデータの入力、クラスタ構成のメンテナンスなどを行う。

4) HDFS

HDFSは、HBaseの高可用性をサポートしながら、HBaseの究極の基盤となるデータストレージサービスを提供します。

3. 追加・削除・確認

HBaseの操作の初心者やテスト段階は HBase shell . 追加、削除、変更などの基本的なコマンドは以下の通りである。

(1) テーブルを作成する

create 'test','cf'

testはテーブル名、cfはカラムのファミリー名です。HBaseのテーブルには、作成時にカラムを定義する場所がないことにお気づきでしょうか(リレーショナルデータベースとは大きく異なりますね)。これは、HBaseのカラムはすべて柔軟で、自由に定義できるためです。カラムが生成されるのは、最初のデータを挿入するときだけです。では、テーブルの属性はどこで定義されるのでしょうか?実は、HBaseのデータ属性はすべてカラムファミリに定義されているのです。

(2) テーブルのプロパティを表示する

describe 'test'

出力します。

hbase(main):002:0> desc 'test'.
テーブルテストはENABLED
test, {TABLE_ATTRIBUTES => {DURABILITY => 'USE_DEFAULT', METADATA => {'IS_ROOT'
=> 'false', 'LINDORM_TABLE_ATTRS' => '\x00x08x00x00x00x00x16WAL_EDIT_WITH_FULL
_ROW\x05false\x00\x00\x00\x00\x00\x0BCONSISTENCY\x08eventual\x00\x00\x00\x00\x00\x16LEADER_BALAN
CE_ENABLED\x01\xFF\x00\x00\x00\x00\x1FFULL_ROW_EDIT_CARRY_LATEST_DATA\x04true\x00\x0
0\x00\x0FDYNAMIC_COLUMNS\x04true\x00\x00\x00\x00\x0FALLOW_FILTERING\x01\x00\x00\x00\x00\x00\
x00\x13LEADER_BALANCE_TYPE\x06single\x00\x00\x00\x00\x12DEFERRED_LOG_FLUSH\x05false'
, 'TABLEMETAVERSION' => '\xE4nx0F'}}.
カラムファミリーの説明
{NAME => 'cf', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BE
HAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false'
DATA_BLOCK_ENCODING => 'DIFF', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICAT
ION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMO
RY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'fal'です。
se', COMPRESSION => 'ZSTD', BLOCKCACHE => 'true', BLOCKSIZE => '65536', METADATA
 => {'STORAGE_POLICY' => 'DEFAULT', 'COMPRESS_TAGS' => 'true', 'DFS_REPLICATION'
 => '2', 'CHS_PROMOTE_ON_MAJOR' => 'true'}}。
1行
0.2150秒

テーブルの記述はあまりなく、カラムファミリーの記述が多いことがわかります。これは従来のリレーショナルデータベースにおけるテーブルに近いもので、テーブル自体はカラムファミリーを保持する単なる空のシェルとなります。

(3) テーブルを見る

<ブロッククオート

リスト

出力します。

hbase(main):001:0>リスト
テーブル
テスト
テスト1
テスト2
test_ls
4行
0.6370秒
=> ["test", "test1", "test2", "test_ls"] となります。

(4) データを挿入する

put 'test','row1','cf:name','jack'

この文の意味は テストテーブルにセルを挿入します。このセルのrowkeyはrow1なので、row1の行にある列ということになります。セルのカラムファミリはcf、セルのカラム名はname、データ値はjackである。データが挿入されるとカラムが作成されることがわかる。テーブル構造の行にカラムが存在しなくても、データがNULLに置換されることはないが、セルが全く押されないことはない。このようにスパースなk-v方式でデータを格納することで、データの格納容量を大幅に圧縮することができる。

(5) スキャンデータ

scan 'test'

出力します。

hbase(main):011:0> scan 'test'.
行 列+セル
 row1 column=cf:name, timestamp=1625911358767, value=jack。
1行
0.5670秒かかった

scanコマンドは select * from test .

(6) データを見る

scanコマンドはデータを一括して読み込むコマンドで、getコマンドはセルのデータを問い合わせることができます

get 'test','row1','cf:name'

HBaseはキー・バリュー・ペアを用いてデータを下部に保存するため、セルのデータに対するクエリーが非常に速く、これもMysqlとは全く異なる点です。

(7) データを削除する

delete 'test','row1','cf:name'

HBaseは実際にデータを削除するのではなく、このバージョンと以前のバージョンを不可視とする墓標を置くことによってレコードを削除します。

(8)テーブルの非活性化

disable 'test'

テーブルが削除される前に無効化する

(9) テーブルを削除する

drop 'test'

4. アプリケーションシナリオ

HBaseはKey/Valueストレージを採用しているため、データ量が増えてもクエリーの性能低下が少ないのが特徴です。何事も弱点がなければ長所にはなり得ない。データ分析はHBaseの弱点です。なぜなら、HBaseとNoSQLエコシステム全体では、テーブルの相関関係がほとんどサポートされていないからです。

うまくいかないシーン レポート作成など、データ分析が主な要件。1つのテーブルのデータ量が1,000万を超えない。MySQLまたはOracleデータベースを推奨します。

適したシナリオ 単一テーブルのデータ量が1000万を超え、なおかつ並行性がかなり高い。データ分析のニーズが弱い、またはそれほど柔軟性やリアルタイム性を必要としない。

5. 参考文献

HBaseは眠らないの本

HBaseの原理と実践

Bサイトビデオ ShangSilicon HBase Tutorial (hbase framework quick start)

Hbaseカラムナストレージを始めるにあたって、この記事は以上です。Hbase columnar storageの詳細については、Script Houseの過去記事を検索するか、以下の記事を引き続きご覧ください。