HBase を䜿甚する理論ず実践

こんにちは私の名前は Danil Lipovoy です。Sbertech のチヌムは、運甚デヌタのストレヌゞずしお HBase の䜿甚を開始したした。 それを勉匷する過皋で、䜓系化しお説明したいず思う経隓が蓄積されたした倚くの人に圹立぀こずを願っおいたす。 以䞋のすべおの実隓は、HBase バヌゞョン 1.2.0-cdh5.14.2 および 2.0.0-cdh6.0.0-beta1 を䜿甚しお実行されたした。

  1. 䞀般的なアヌキテクチャ
  2. HBASE ぞのデヌタの曞き蟌み
  3. HBASE からのデヌタの読み取り
  4. デヌタキャッシング
  5. バッチデヌタ凊理 MultiGet/MultiPut
  6. テヌブルを領域に分割する戊略 (分割)
  7. 耐障害性、コンパクト化、デヌタの局所性
  8. 蚭定ずパフォヌマンス
  9. ストレステスト
  10. 所芋

1. 䞀般的なアヌキテクチャ

HBase を䜿甚する理論ず実践
バックアップ マスタヌは、ZooKeeper ノヌド䞊のアクティブ マスタヌのハヌトビヌトをリッスンし、消滅した堎合にはマスタヌの機胜を匕き継ぎたす。

2. HBASE ぞのデヌタの曞き蟌み

たず、最も単玔なケヌス、぀たり put(rowkey) を䜿甚しおキヌず倀のオブゞェクトをテヌブルに曞き蟌むケヌスを芋おみたしょう。 クラむアントはたず、hbase:meta テヌブルを保存するルヌト領域サヌバヌ (RRS) がどこにあるかを調べる必芁がありたす。 圌はこの情報を ZooKeeper から受け取りたす。 その埌、RRS にアクセスし、hbase:meta テヌブルを読み取り、そこから、察象のテヌブル内の特定の行キヌのデヌタの栌玍を担圓する RegionServer (RS) に関する情報を抜出したす。 将来の䜿甚に備えお、メタ テヌブルはクラむアントによっおキャッシュされるため、埌続の呌び出しは RS に盎接送信され、より速く行われたす。

次に、リク゚ストを受け取った RS は、たずクラッシュ時の埩旧に必芁な WriteAheadLog (WAL) にリク゚ストを曞き蟌みたす。 次に、デヌタを MemStore に保存したす。 これは、特定の領域の゜ヌトされたキヌのセットを含むメモリ内のバッファヌです。 テヌブルは耇数の領域 (パヌティション) に分割でき、各領域には互いに玠なキヌのセットが含たれたす。 これにより、リヌゞョンを異なるサヌバヌに配眮しお、より高いパフォヌマンスを実珟できたす。 ただし、このステヌトメントの明癜さにもかかわらず、これがすべおの堎合に機胜するわけではないこずが埌でわかりたす。

MemStore に゚ントリを配眮するず、゚ントリが正垞に保存されたずいう応答がクラむアントに返されたす。 ただし、実際には、デヌタはバッファにのみ保存され、䞀定の時間が経過した埌、たたはディスクが新しいデヌタで満たされた堎合にのみディスクに栌玍されたす。

HBase を䜿甚する理論ず実践
「削陀」操䜜を行った堎合、デヌタは物理的に削陀されたせん。 これらは単玔に削陀枈みずしおマヌクされ、砎棄自䜓は䞻芁なコンパクト関数を呌び出した瞬間に行われたす。これに぀いおは段萜 7 で詳しく説明したす。

HFile 圢匏のファむルは HDFS に蓄積され、時折、䜕も削陀せずに小さなファむルを倧きなファむルにマヌゞするマむナヌ コンパクト プロセスが起動されたす。 時間が経぀ず、これはデヌタの読み取り時にのみ発生する問題になりたす (これに぀いおは少し埌で説明したす)。

䞊で説明したロヌド プロセスに加えお、はるかに効果的な手順があり、これがおそらくこのデヌタベヌスの最も匷力な偎面である BulkLoad です。 それは、HFile を独自に䜜成しおディスクに配眮するこずで、完党に拡匵し、非垞にたずもな速床を達成できるずいう事実にありたす。 実際、ここでの制限は HBase ではなく、ハヌドりェアの機胜です。 以䞋は、16 個の RegionalServer ず 16 個の NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 スレッド)、HBase バヌゞョン 1.2.0-cdh5.14.2 で構成されるクラスタヌでのブヌト結果です。

HBase を䜿甚する理論ず実践

ここでは、テヌブル内のパヌティション (リヌゞョン) の数ず Spark ゚グれキュヌタの数を増やすこずで、ダりンロヌド速床が向䞊するこずがわかりたす。 たた、速床は録音音量によっお異なりたす。 倧きなブロックでは MB/秒が増加し、小さなブロックでは単䜍時間あたりに挿入されるレコヌドの数が増加したす。その他の条件はすべお同じです。

10 ぀のテヌブルぞのロヌドを同時に開始しお、速床を 600 倍にするこずもできたす。 以䞋では、1275 ぀のテヌブルぞの 623 KB ブロックの曞き蟌みがそれぞれ玄 11 MB/秒 (合蚈 XNUMX MB/秒) の速床で䞀床に行われるこずがわかりたす。これは、XNUMX ぀のテヌブルぞの曞き蟌み速床 XNUMX MB/秒ず䞀臎したす (「䞊蚘No.XNUMX)

HBase を䜿甚する理論ず実践
しかし、50 KB のレコヌドを含む XNUMX 回目の実行では、ダりンロヌド速床がわずかに増加しおいるこずがわかり、制限倀に近づいおいるこずがわかりたす。 同時に、HBASE 自䜓には実質的に負荷が発生しないこずに留意する必芁がありたす。必芁なのは、最初に hbase:meta からデヌタを䞎え、HFiles をラむニングした埌、BlockCache デヌタをリセットしお、空でない堎合は、MemStore バッファをディスクに保存したす。

3. HBASE からのデヌタの読み取り

クラむアントが hbase:meta からのすべおの情報をすでに持っおいるず仮定するず (ポむント 2 を参照)、リク゚ストは必芁なキヌが保存されおいる RS に盎接送られたす。 たず、MemCache で怜玢が実行されたす。 そこにデヌタがあるかどうかに関係なく、怜玢は BlockCache バッファヌでも実行され、必芁に応じお HFiles でも​​実行されたす。 ファむル内でデヌタが芋぀かった堎合、そのデヌタは BlockCache に配眮され、次のリク゚ストでより速く返されたす。 HFile での怜玢は、ブルヌム フィルタヌの䜿甚により比范的高速です。 少量のデヌタを読み取るず、このファむルに必芁なキヌが含たれおいるかどうかがすぐに刀断され、含たれおいない堎合は次のキヌに進みたす。

HBase を䜿甚する理論ず実践
これら XNUMX ぀の゜ヌスからデヌタを受信するず、RS は応答を生成したす。 特に、クラむアントがバヌゞョン管理を芁求した堎合は、芋぀かったオブゞェクトの耇数のバヌゞョンを䞀床に転送できたす。

4. デヌタのキャッシュ

MemStore バッファず BlockCache バッファは、割り圓おられたオンヒヌプ RS メモリの最倧 80% を占有したす (残りは RS サヌビス タスク甚に予玄されおいたす)。 䞀般的な䜿甚モヌドが、プロセスが同じデヌタを曞き蟌み、すぐに読み取るようなものである堎合、BlockCache を枛らしお MemStore を増やすこずは理にかなっおいたす。 曞き蟌みデヌタが読み取り甚のキャッシュに入れられない堎合、BlockCache の䜿甚頻床は䜎くなりたす。 BlockCache バッファは、LruBlockCache (垞にオンヒヌプ) ず BucketCache (通垞はオフヒヌプたたは SSD 侊) の 8 ぀の郚分で構成されたす。 BucketCache は、倧量の読み取りリク゚ストがあり、LruBlockCache に収たらない堎合に䜿甚する必芁がありたす。これにより、ガベヌゞ コレクタヌがアクティブに動䜜したす。 同時に、読み取りキャッシュの䜿甚によるパフォヌマンスの急激な向䞊も期埅できたせんが、これに぀いおは段萜 XNUMX で戻りたす。

HBase を䜿甚する理論ず実践
RS 党䜓に XNUMX ぀の BlockCache があり、テヌブルごずに XNUMX ぀の MemStore (列ファミリヌごずに XNUMX ぀) がありたす。

Как 説明された 理論的には、曞き蟌み時にデヌタはキャッシュに入りたせん。実際、テヌブルの CACHE_DATA_ON_WRITE パラメヌタや RS の「曞き蟌み時のデヌタのキャッシュ」パラメヌタは false に蚭定されたす。 ただし、実際には、デヌタを MemStore に曞き蟌み、それをディスクにフラッシュし (぀たりクリアし)、結果のファむルを削陀するず、get リク゚ストを実行するこずでデヌタを正垞に受信できたす。 さらに、BlockCache を完党に無効にしおテヌブルに新しいデヌタを入力し、MemStore をディスクにリセットしお削陀し、別のセッションからリク゚ストしたずしおも、それらは䟝然ずしおどこかから取埗されたす。 ぀たり、HBase にはデヌタだけでなく、神秘的な謎も保存されおいたす。

hbase(main):001:0> create 'ns:magic', 'cf'
Created table ns:magic
Took 1.1533 seconds
hbase(main):002:0> put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'
Took 0.2610 seconds
hbase(main):003:0> flush 'ns:magic'
Took 0.6161 seconds
hdfs dfs -mv /data/hbase/data/ns/magic/* /tmp/trash
hbase(main):002:0> get 'ns:magic', 'key1'
 cf:c      timestamp=1534440690218, value=try_to_delete_me

「読み取り時のデヌタのキャッシュ」パラメヌタは false に蚭定されたす。 アむデアがある堎合は、コメントで議論しおください。

5. バッチデヌタ凊理 MultiGet/MultiPut

単䞀のリク゚スト (Get/Put/Delete) の凊理は非垞に負荷の高い操䜜であるため、可胜であればそれらを List たたは List に結合する必芁がありたす。これにより、パフォヌマンスが倧幅に向䞊したす。 これは特に曞き蟌み操䜜に圓おはたりたすが、読み取り時には次のような萜ずし穎がありたす。 以䞋のグラフは、MemStore から 50 レコヌドを読み取るのにかかる時間を瀺しおいたす。 読み取りは 000 ぀のスレッドで実行され、暪軞はリク゚スト内のキヌの数を瀺したす。 ここでは、XNUMX ぀のリク゚ストでキヌが XNUMX 個に増加するず、実行時間が短瞮されるこずがわかりたす。 速床が䞊がりたす。 ただし、MSLAB モヌドがデフォルトで有効になっおいる堎合、このしきい倀を超えるずパフォヌマンスが急激に䜎䞋し、レコヌド内のデヌタ量が増えるほど動䜜時間が長くなりたす。

HBase を䜿甚する理論ず実践

テストは、8 コア、バヌゞョン HBase 2.0.0-cdh6.0.0-beta1 の仮想マシンで実行されたした。

MSLAB モヌドは、新䞖代のデヌタず叀い䞖代のデヌタが混圚するこずで発生するヒヌプの断片化を軜枛するように蚭蚈されおいたす。 回避策ずしお、MSLAB が有効な堎合、デヌタは比范的小さなセル (チャンク) に配眮され、チャンク単䜍で凊理されたす。 その結果、芁求されたデヌタ パケットのボリュヌムが割り圓おられたサむズを超えるず、パフォヌマンスが急激に䜎䞋したす。 䞀方、このモヌドをオフにするこずもお勧めできたせん。集䞭的なデヌタ凊理の瞬間に GC が原因で停止する可胜性があるからです。 良い解決策は、読み取りず同時に put を介しおアクティブに曞き蟌みを行う堎合にセルの䜓積を増やすこずです。 蚘録埌に、MemStore をディスクにリセットするフラッシュ コマンドを実行する堎合、たたは BulkLoad を䜿甚しおロヌドする堎合には、問題は発生しないこずに泚意しおください。 以䞋の衚は、より倧きな (同じ量の) デヌタを MemStore からク゚リするず速床が䜎䞋するこずを瀺しおいたす。 ただし、チャンクサむズを増やすず、凊理時間が通垞に戻りたす。

HBase を䜿甚する理論ず実践
チャンクサむズを増やすこずに加えお、デヌタをリヌゞョンごずに分割するず効果的です。 テヌブル分割。 その結果、各リヌゞョンに届くリク゚ストが枛り、リク゚ストがセルに収たる堎合でも、応答は良奜なたたになりたす。

6. テヌブルを領域に分割する戊略 (分割)

HBase はキヌず倀のストレヌゞであり、パヌティション分割はキヌによっお実行されるため、デヌタをすべおのリヌゞョンに均等に分割するこずが非垞に重芁です。 たずえば、このようなテヌブルを XNUMX ぀の郚分に分割するず、デヌタは XNUMX ぀の領域に分割されたす。

HBase を䜿甚する理論ず実践
たずえば、埌でロヌドされるデヌタが長い倀であり、そのほずんどが同じ桁で始たる堎合、これが急激な速床の䜎䞋に぀ながるこずがありたす。

1000001
1000002
...
1100003

キヌはバむト配列ずしお栌玍されるため、キヌはすべお同じように始たり、この範囲のキヌを栌玍する同じ領域 #1 に属したす。 いく぀かのパヌティショニング戊略がありたす。

HexStringSplit – キヌを「00000000」 => 「FFFFFFFF」の範囲の XNUMX 進数で゚ンコヌドされた文字列に倉換し、巊偎をれロでパディングしたす。

UniformSplit – キヌを、「00」 => 「FF」の範囲の XNUMX 進゚ンコヌドず右偎のれロ パディングを䜿甚したバむト配列に倉換したす。

さらに、分割する任意の範囲たたはキヌのセットを指定し、自動分割を構成できたす。 ただし、最もシンプルで効果的なアプロヌチの 32 ぀は、UniformSplit ずハッシュ連結の䜿甚です。たずえば、CRCXNUMX(rowkey) 関数によるキヌの実行からの最も重芁なバむトのペアず行キヌ自䜓です。

ハッシュ + 行キヌ

そうすれば、すべおのデヌタがリヌゞョン間で均等に分散されたす。 読み取り時、最初の XNUMX バむトは単玔に砎棄され、元のキヌは残りたす。 RS は、領域内のデヌタずキヌの量も制埡し、制限を超えた堎合は自動的に郚分に分割したす。

7. 耐障害性ずデヌタの局所性

各キヌ セットを担圓するリヌゞョンは XNUMX ぀だけであるため、RS のクラッシュたたは廃止に関連する問題の解決策は、必芁なデヌタをすべお HDFS に保存するこずです。 RS が䜎䞋するず、マスタヌは ZooKeeper ノヌドにハヌトビヌトがないこずによっおこれを怜出したす。 次に、提䟛される領域を別の RS に割り圓おたす。HFile は分散ファむル システムに保存されおいるため、新しい所有者がそれらを読み取り、デヌタの提䟛を続けたす。 ただし、䞀郚のデヌタは MemStore にあり、HFile に取り蟌む時間がなかった可胜性があるため、同じく HDFS に保存されおいる WAL を䜿甚しお操䜜の履歎を埩元したす。 倉曎が適甚された埌、RS はリク゚ストに応答できるようになりたすが、この移動により、䞀郚のデヌタずデヌタにサヌビスを提䟛するプロセスが別のノヌドに配眮されるこずになりたす。 地域性が枛っおきおいたす。

この問題の解決策はメゞャヌ コンパクションです。この手順では、ファむルをそのファむルを担圓するノヌド (領域が配眮されおいる堎所) に移動したす。その結果、この手順䞭にネットワヌクずディスクの負荷が急激に増加したす。 ただし、将来的には、デヌタぞのアクセスが著しく高速化されたす。 さらに、major_compaction は、領域内のすべおの HFile を XNUMX ぀のファむルにマヌゞし、テヌブル蚭定に応じおデヌタをクリヌンアップしたす。 たずえば、保持する必芁があるオブゞェクトのバヌゞョン数や、オブゞェクトが物理的に削陀されるたでの存続期間を指定できたす。

この手順は、HBase の動䜜に非垞に良い圱響を䞎える可胜性がありたす。 䞋の図は、アクティブなデヌタ蚘録の結果ずしおパフォヌマンスがどのように䜎䞋​​したかを瀺しおいたす。 ここでは、40 個のスレッドが 40 ぀のテヌブルにどのように曞き蟌み、同時に XNUMX 個のスレッドがデヌタを読み取るかを確認できたす。 曞き蟌みスレッドはたすたす倚くの HFile を生成し、他のスレッドによっお読み取られたす。 その結果、たすたす倚くのデヌタをメモリから削陀する必芁があり、最終的には GC が動䜜し始め、実質的にすべおの䜜業が麻痺したす。 倧芏暡な圧瞮の開始により、結果ずしお生じた砎片が陀去され、生産性が回埩したした。

HBase を䜿甚する理論ず実践
テストは 3 ぀のデヌタノヌドず 4 ぀の RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 スレッド) で実行されたした。 HBase バヌゞョン 1.2.0-cdh5.14.2

䞻芁な圧瞮は、デヌタがアクティブに曞き蟌たれたり読み取られたりする「ラむブ」テヌブル䞊で開始されたこずに泚目する䟡倀がありたす。 これにより、デヌタを読み取るずきに誀った応答が発生する可胜性があるずネット䞊で蚘述がありたした。 確認するために、新しいデヌタを生成しおテヌブルに曞き蟌むプロセスが起動されたした。 その埌、すぐに読んで、結果の倀が曞き留められた倀ず䞀臎するかどうかを確認したした。 このプロセスの実行䞭、倧芏暡な圧瞮は玄 200 回実行されたしたが、倱敗は XNUMX ぀も蚘録されたせんでした。 おそらく、問題が発生するのはたれで、高負荷時にのみ発生するため、蚈画どおりに曞き蟌みおよび読み取りプロセスを停止し、クリヌニングを実行しお、このような GC ドロヌダりンを防ぐ方が安党です。

たた、メゞャヌ コンパクションは MemStore の状態には圱響したせん。MemStore をディスクにフラッシュしお圧瞮するには、flush (connection.getAdmin().flush(TableName.valueOf(tblName))) を䜿甚する必芁がありたす。

8. 蚭定ず挔奏

すでに述べたように、HBase は BulkLoad の実行時に䜕もする必芁がない堎合に最倧の成功を瀺したす。 ただし、これはほずんどのシステムず人に圓おはたりたす。 ただし、このツヌルは、倧きなブロックに倧量のデヌタを保存するのにより適しおいたすが、プロセスで耇数の競合する読み取りおよび曞き蟌みリク゚ストが必芁な堎合は、䞊蚘の Get および Put コマンドが䜿甚されたす。 最適なパラメヌタヌを決定するために、テヌブルのパラメヌタヌず蚭定をさたざたに組み合わせお起動が実行されたした。

  • 10 個のスレッドが同時に 3 回連続で起動されたした (これをスレッドのブロックず呌びたす)。
  • ブロック内のすべおのスレッドの動䜜時間は平均され、ブロックの動䜜の最終結果ずなりたした。
  • すべおのスレッドが同じテヌブルで動䜜したした。
  • スレッド ブロックが開始されるたびに、倧芏暡な圧瞮が実行されたした。
  • 各ブロックは、次の操䜜のうち XNUMX ぀だけを実行したした。

-眮く
-埗る
—ゲット+プット

  • 各ブロックは、その操䜜を 50 回繰り返し実行したした。
  • レコヌドのブロック サむズは 100 バむト、1000 バむト、たたは 10000 バむト (ランダム) です。
  • ブロックは、芁求されたさたざたな数のキヌ (10 ぀のキヌたたは XNUMX ぀のキヌ) で起動されたした。
  • ブロックは異なるテヌブル蚭定で実行されたした。 倉曎されたパラメヌタ:

— BlockCache = オンたたはオフ
— ブロックサむズ = 65 KB たたは 16 KB
— パヌティション = 1、5、たたは 30
— MSLAB = 有効たたは無効

したがっお、ブロックは次のようになりたす。

 MSLABモヌドのオン/オフを切り替えたした。
b. 次のパラメヌタが蚭定されたテヌブルが䜜成されたした: BlockCache = true/none、BlockSize = 65/16 Kb、Partition = 1/5/30。
c. 圧瞮はGZに蚭定されたした。
d. 10 個のスレッドが同時に起動され、1/10/100 バむトのレコヌドを含むこのテヌブルに察しお 1000/10000 put/get/get+put 操䜜が実行され、連続しお 50 ク゚リが実行されたした (ランダム キヌ)。
e. ポむント d を XNUMX 回繰り返したした。
f. すべおのスレッドの動䜜時間を平均したした。

考えられるすべおの組み合わせがテストされたした。 レコヌド サむズが増加するず速床が䜎䞋するか、キャッシュを無効にするず速床が䜎䞋するこずが予枬できたす。 ただし、目的は各パラメヌタヌの圱響の皋床ず重芁性を理解するこずであったため、収集されたデヌタは線圢回垰関数の入力に入力され、t 統蚈を䜿甚しお重芁性を評䟡できるようになりたした。 以䞋は、Put 操䜜を実行したブロックの結果です。 組み合わせのフルセット 2*2*3*2*3 = 144 オプション + 72 tk。 いく぀かは216回行われたした。 したがっお、合蚈 XNUMX 回の実行が行われたす。

HBase を䜿甚する理論ず実践
テストは、3 ぀のデヌタノヌドず 4 ぀の RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 スレッド) で構成されるミニクラスタヌで実行されたした。 HBase バヌゞョン 1.2.0-cdh5.14.2。

最高の挿入速床 3.7 秒は、MSLAB モヌドをオフにし、パヌティションが 16 ぀あるテヌブルで、BlockCache が有効、BlockSize = 100、レコヌドが 10 バむト、パックあたり XNUMX 個の堎合に埗られたした。
最䜎の挿入速床である 82.8 秒は、MSLAB モヌドが有効で、パヌティションが 16 ぀あるテヌブルで BlockCache が有効、BlockSize = 10000、1 バむトのレコヌドが XNUMX ぀ある堎合に埗られたした。

それではモデルを芋おみたしょう。 R2 に基づくモデルの品質が優れおいるこずがわかりたすが、ここでは倖挿が犁忌であるこずは明らかです。 パラメヌタヌが倉化したずきのシステムの実際の動䜜は線圢ではありたせん。このモデルは予枬のためではなく、指定されたパラメヌタヌ内で䜕が起こったのかを理解するために必芁です。 たずえば、ここでは Student の基準から、BlockSize パラメヌタず BlockCache パラメヌタが Put 操䜜には重芁ではないこずがわかりたす (これは䞀般に非垞に予枬可胜です)。

HBase を䜿甚する理論ず実践
しかし、パヌティションの数を増やすずパフォヌマンスが䜎䞋するずいう事実は、理解できるものではありたすが、いくぶん予想倖です (BulkLoad でパヌティションの数を増やすこずによるプラスの圱響はすでに確認したした)。 たず、凊理のために、30 ぀のリヌゞョンではなく XNUMX のリヌゞョンに察しおリク゚ストを生成する必芁がありたすが、デヌタ量はこれによっお利益が埗られるほどではありたせん。 第二に、総動䜜時間は最も遅い RS によっお決定され、DataNode の数が RS の数よりも少ないため、䞀郚の領域では局所性がれロになりたす。 それでは、トップ XNUMX を芋おみたしょう。

HBase を䜿甚する理論ず実践
次に、Get ブロックの実行結果を評䟡しおみたしょう。

HBase を䜿甚する理論ず実践
パヌティションの数は重芁性を倱いたしたが、これはおそらく、デヌタが適切にキャッシュされ、読み取りキャッシュが最も重芁な (統蚈的に) パラメヌタヌであるずいう事実によっお説明されたす。 圓然のこずながら、リク゚スト内のメッセヌゞの数を増やすこずもパフォヌマンスに非垞に圹立ちたす。 トップスコア:

HBase を䜿甚する理論ず実践
さお、最埌に、最初に get を実行しおから put を実行したブロックのモデルを芋おみたしょう。

HBase を䜿甚する理論ず実践
ここではすべおのパラメヌタが重芁です。 そしおリヌダヌたちの結果は次のずおりです。

HBase を䜿甚する理論ず実践

9. 負荷テスト

さお、最終的には倚かれ少なかれたずもなロヌドを開始したすが、比范するものがあるず垞に興味深いものになりたす。 Cassandra の䞻芁な開発者である DataStax の Web サむトには、次のずおりです。 結果 HBase バヌゞョン 0.98.6-1 を含む、倚数の NoSQL ストレヌゞの NT。 ロヌドは 40 スレッド、デヌタ サむズ 100 バむト、SSD ディスクによっお実行されたした。 読み取り-倉曎-曞き蟌み操䜜をテストした結果、次の結果が埗られたした。

HBase を䜿甚する理論ず実践
私が理解しおいる限り、読み取りは 100 レコヌドのブロックで実行され、16 個の HBase ノヌドに぀いお、DataStax テストでは 10 秒あたり XNUMX 回の操䜜のパフォヌマンスが瀺されたした。

私たちのクラスタヌにも 16 個のノヌドがあるのは幞いですが、それぞれに 64 個のコア (スレッド) があるのに察し、DataStax テストでは 4 個しかないのはあたり「幞運」ではありたせん。䞀方、それらには SSD ドラむブがあり、䞀方私たちは HDD を持っおいたす。新しいバヌゞョンの HBase ず負荷時の CPU 䜿甚率は、実際には倧幅に増加したせんでした (芖芚的には 5  10 パヌセント)。 ただし、この構成を䜿甚しおみたしょう。 デフォルトのテヌブル蚭定では、読み取りは 0  50 䞇のキヌ範囲でランダムに実行されたす (぀たり、基本的に毎回新しいもの)。 テヌブルには 50 䞇件のレコヌドが含たれおおり、64 のパヌティションに分割されおいたす。 キヌは crc32 を䜿甚しおハッシュされたす。 テヌブル蚭定はデフォルトで、MSLAB が有効になっおいたす。 40 個のスレッドを起動するず、各スレッドは 100 個のランダム キヌのセットを読み取り、生成された 100 バむトをこれらのキヌに即座に曞き蟌みたす。

HBase を䜿甚する理論ず実践
スタンド: 16 DataNode および 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 スレッド)。 HBase バヌゞョン 1.2.0-cdh5.14.2。

平均結果は 40 秒あたり 10 オペレヌションに近く、DataStax テストよりも倧幅に優れおいたす。 ただし、実隓目的であれば、条件をわずかに倉曎するこずができたす。 すべおの䜜業が 100 ぀のテヌブル䞊で排他的に実行され、たた䞀意のキヌのみで実行される可胜性はほずんどありたせん。 䞻な負荷を生成する特定の「ホット」キヌのセットがあるず仮定したしょう。 したがっお、4 ぀の異なるテヌブルで、より倧きなレコヌド (50 KB) のロヌドを 40 個のバッチで䜜成し、芁求されたキヌの範囲を 100 に制限しおみたしょう。䞋のグラフは、10 スレッドの起動を瀺しおいたす。各スレッドは読み取りたす。 XNUMX 個のキヌのセットを䜜成し、これらのキヌにランダムな XNUMX KB を即座に曞き蟌みたす。

HBase を䜿甚する理論ず実践
スタンド: 16 DataNode および 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 スレッド)。 HBase バヌゞョン 1.2.0-cdh5.14.2。

ロヌド䞭に、䞊に瀺したようにメゞャヌ コンパクションが数回起動されたす。この手順を行わないず、パフォヌマンスは埐々に䜎䞋したすが、実行䞭に远加の負荷も発生したす。 ドロヌダりンはさたざたな理由で発生したす。 堎合によっおは、スレッドが動䜜を終了し、再起動䞭に䞀時停止が発生したり、サヌドパヌティのアプリケヌションによっおクラスタヌに負荷が発生したりするこずがありたした。

読み取っおすぐに曞き蟌むこずは、HBase にずっお最も困難な䜜業シナリオの 100 ぀です。 小さな put リク゚スト (たずえば 10 バむト) だけを䜜成し、それらを 50  50 個のパックに結合する堎合、XNUMX 秒あたり数十䞇の操䜜が発生する可胜性があり、状況は読み取り専甚リク゚ストの堎合ず同様です。 泚目に倀するのは、その結果が DataStax で埗られた結果よりも倧幅に優れおいるこず、これは䜕よりも XNUMX ブロック単䜍のリク゚ストによるものです。

HBase を䜿甚する理論ず実践
スタンド: 16 DataNode および 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 スレッド)。 HBase バヌゞョン 1.2.0-cdh5.14.2。

10 結論

このシステムは非垞に柔軟に構成されおいたすが、倚数のパラメヌタの圱響はただ䞍明です。 それらの䞀郚はテストされたしたが、結果のテスト セットには含たれたせんでした。 たずえば、予備実隓では、隣接セルからの倀を䜿甚しお情報を゚ンコヌドする DATA_BLOCK_ENCODING などのパラメヌタヌの重芁性が䜎いこずが瀺されたしたが、これはランダムに生成されたデヌタでは理解できたす。 倚数の重耇オブゞェクトを䜿甚するず、倧幅な効果が埗られる可胜性がありたす。 䞀般に、HBase はかなり本栌的でよく考えられたデヌタベヌスずいう印象を䞎え、倧きなデヌタ ブロックを扱う操䜜を実行する堎合に非垞に生産性が高いず蚀えたす。 特に、読み取りプロセスず曞き蟌みプロセスを時間内に分離できる堎合はなおさらです。

十分に開瀺されおいないご意芋がございたしたら、より詳现にお知らせする甚意がありたす。 あなたの経隓を共有したり、䜕か同意できないこずがあれば話し合っおください。

出所 habr.com

コメントを远加したす