HBaseがリアルタイムコンピューティングサービスを提供できる主な理由は、そのアーキテクチャと基礎となるデータ構造によって決定されます。これは、LSM-Tree(ログ構造化マージツリー)+ HTable(領域パーティション)+キャッシュアーキテクチャを採用して、HBaseのクエリ速度を保証します。
1. LSMツリーの原理
LSMツリーは、1996年の論文「The Log-Structured Merge-Tree(LSM-Tree)」に由来します。これは、現在NoSQLシステムで非常に一般的であり、基本的に必須のソリューションになっています。この記事では、LSMツリーの主な機能を紹介します思想。
LSMツリーは、キー値ストレージシステム用に特別に設計されています。キー値ストレージシステムには、put(k、v)という2つの主要な機能があります。1つを書き込む(k、v)、get(k) :kを指定してvを見つけます。LSMツリーの最大の特徴はその高速な書き込み速度であり、主にディスクの順次書き込みを使用し、ランダムに書き込む必要があるBツリーをpkがドロップします。
以下の図は、多層構造であるLSMツリーの不可欠な部分です。1つ目は、最近書き込まれた(k、v)をすべて格納するメモリの C0レイヤーです。このメモリ構造は順序付けされており、その場でいつでも更新でき、いつでもクエリをサポートします。残りのC1からCkのレイヤーはディスク上にあり、各レイヤーはキー上の順序付けられた構造です。
書き込みプロセス:put(k、v)操作が開始され、最初に書き込み前ログ(Write Ahead Log、つまり実際に書き込む前に記録されたログ)に追加され、次にC0レイヤーに追加されます。C0レイヤーのデータが特定のサイズに達すると、マージとソートと同様に、C0レイヤーとC1レイヤーがマージされ、このプロセスがコンパクションです。マージされた新しいnew-C1は順次ディスクに書き込まれ、元のold-C1が置き換えられます。C1レイヤーが特定のサイズに達すると、下位レイヤーとのマージが続行されます。マージ後、古いファイルをすべて削除して、新しいファイルを残すことができます。
データの書き込みが繰り返される可能性があり、新しいバージョンが古いバージョンを上書きする必要があることに注意してください。新しいバージョンは何ですか、最初に(a = 1)、次に(a = 233)と書いて、233が新しいバージョンです。の古いバージョンがCkレイヤーに達している場合、この時点で新しいバージョンがC0レイヤーに追加されます。現時点では、下のファイルに古いバージョンがあるかどうかは関係ありません。古いバージョンのクリーンアップは、マージ中に行われます。
書き込みプロセスは基本的にメモリ構造のみを使用し、圧縮は書き込みをブロックせずにバックグラウンドで非同期に完了できます。
クエリプロセス:書き込みプロセスでは、最新のデータがC0レイヤーにあり、最も古いデータがCkレイヤーにあることがわかります。したがって、クエリは最初にC0レイヤーをチェックすることもできます。チェックするkがない場合は、レイヤーごとにC1レイヤーをチェックします。
1つのクエリで複数のシングルポイントクエリが必要になる場合がありますが、少し時間がかかります。したがって、LSMツリーは主に、集中的な書き込みとクエリの少ないシナリオを対象としています。
LSMツリーは、LevelDB、RocksDBなどのさまざまなキー値データベースで使用され、分散行ストレージデータベースCassandraもLSMツリーストレージアーキテクチャを使用します。
第二に、HBaseでのLSMツリーの使用
1. HBase書き込みプロセス
データは最初にメモリに書き込まれます。メモリデータの損失を防ぐために、HBaseのMemStoreおよびHLogに対応するメモリへの書き込み中に、データをディスクに保持する必要があります。
MemStoreのデータが特定のしきい値に達した後、データをディスクにフラッシュする必要があります。つまり、HFile(これも小さなB +ツリー)ファイルが生成されます。
hbaseのマイナー(小さなHFile小さなファイルマージ)メジャー(リージョンマージ内のすべてのHFileファイル)は、コンパクトな操作を実行し、無効なデータ(古いデータと削除されたデータ)を同時に削除します。このとき、複数の小さなツリーが大きなツリーにマージされます。読書パフォーマンスを向上させます。
2. LSMツリーのHBaseの最適化
ブルームフィルター:これはランダムな確率のビットマップであり、小さな順序付けられた構造に指定されたデータがあるかどうかをすばやく知ることができます。そのため、データがバイナリ検索なしの小さなセットに含まれているかどうか、およびいくつかの単純な計算のみを行うことができます。効率は向上しましたが、スペースが犠牲になります。
コンパクト:小さなツリーは大きなツリーにマージされます:小さなツリーのパフォーマンスは問題があるため、小さなツリーを大きなツリーに継続的にマージするプロセスが必要です。これにより、古いデータクエリのほとんどもlog2Nを使用して直接見つけることができるため、必要ありません。次に、(N / m)* log2nのクエリを実行します。