すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for HBase:読み取りの最適化

最終更新日:Jan 16, 2025

ApsaraDB for HBase は非常に柔軟性が高く、複数のシナリオに適応できます。次のセクションでは、読み取り操作の最適化について説明します。本番環境では、Full GC、Out of Memory(OOM)、Region in Transition(RIT)、読み取りレイテンシの高さなどのエラーが発生する可能性があります。ハードウェアのアップグレードによってこれらの問題の一部は解決できますが、より現実的なアプローチは、ニーズに基づいて HBase を最適化することです。

最適化は以下のように分類されます。

クライアントの最適化、サーバーの最適化、およびプラットフォームの最適化(ApsaraDB for HBase に実装されています)。

これにより、クライアントとサーバー間の RPC 呼び出しの数が大幅に減少し、スループットが大幅に向上します。

 Result[] re= table.get(List<Get> gets)     // クライアントは、複数の Get リクエストを 1 つの RPC リクエストにマージできます。

SCAN 操作に適切なキャッシュサイズが設定されているかどうかの確認

SCAN 操作では、サーバーがリクエストごとに大量のデータを返す必要があります。クライアントが SCAN 操作を呼び出すと、サーバーはデータをバッチでクライアントに返します。これは、一度に大量のデータが転送される場合に、サーバーとクライアントの両方でワークロードを削減するために設計されています。データはローカルにキャッシュされます。キャッシュされるレコードのデフォルトの最大数は 100 です。一部の SCAN 操作では、RPC リクエストを介して大量のデータ(数百または数万)が返される場合があります。ニーズに合わせてキャッシュのサイズを拡張することをお勧めします。

scan.setCaching(int caching) // SCAN 操作で大量のデータが返される可能性がある場合は、このパラメーターを 1000 に設定します。            

指定された列ファミリーまたは列名をリクエストする

ApsaraDB for HBase は列指向データベースです。データは列ファミリーに基づいて格納され、各列ファミリーは個別のデータベースです。入力/出力(I/O)を削減するために、クエリを実行するときに列ファミリーまたは列名を指定することをお勧めします。

ApsaraDB for HBase にオフラインでアクセスする場合はキャッシュを無効にする

ApsaraDB for HBase にオフラインでアクセスする場合、データ全体が一度に読み取られます。この場合、キャッシュは必要ありません。オフライン読み取りの場合は BlockCache を無効にすることをお勧めします。

scan.setBlockCache(false) // オフライン読み取りの場合は BlockCache を無効にします。
            

サーバーの最適化

リクエストバランシング

ピーク時の読み取りワークロードの状態を確認します。ApsaraDB for HBase コンソールで状態を確認できます。明らかなホットスポッティングがある場合、最終的な解決策は、ワークロードのバランスをとるために rowkey を再設計することです。中間的な解決策は、ホットスポッティング領域を分割することです。

BlockCache が適切に設定されているかどうか

BlockCache は、読み取りキャッシュとして読み取りパフォーマンスにとって重要です。大量のデータがリクエストされる場合は、コアとメモリの比率が 1:4 のサーバーを使用することをお勧めします。たとえば、8 コア 32 GB メモリのマシン、または 16 コア 64 GB メモリのマシンです。BlockCache の値を増やし、Memstore の値を減らすことができます。

ApsaraDB for HBase のコンソールで hfile.block.cache.size を 0.5 に設定し、hbase.regionserver.global.memstore.size を 0.3 に設定してから、[再起動] をクリックします。

HFile の数

読み取り操作中に、HFile を頻繁に開く必要があります。I/O 操作の数は HFile の数に比例して増加し、読み取りレイテンシが増加します。この影響を軽減するために、オフピーク時にメジャーコンパクションを実行することをお勧めします。

コンパクションが大量のシステムリソースを消費するかどうか

コンパクションは、主に複数の小さな HFile を 1 つの大きな HFile にマージするために使用されます。この操作により、後続の読み取り操作の読み取りパフォーマンスが向上しますが、大量のリソースも消費します。通常、構成が不適切でない限り、マイナーコンパクションは大量のシステムリソースを消費しません。ピーク時にはメジャーコンパクションを実行しないでください。オフピーク時にメジャーコンパクションを実行することをお勧めします。

Bloomfilter が適切に設定されているかどうか

Bloomfilter は、主にクエリ中に HFile をフィルタリングして、不要な I/O 操作を回避するために使用されます。Bloomfilter は読み取りパフォーマンスを向上させることができます。通常、テーブルを作成するときに、BLOOMFILTER のデフォルト値は ROW に設定されます。

プラットフォームの最適化

データローカリゼーションの割合が低すぎるかどうか(プラットフォームは Alibaba Cloud によって最適化されています。)

ローカル HFile がある場合は、Short-Circuit Local Read を使用することをお勧めします。再起動または拡張操作中に、ApsaraDB for HBase は移動されたリージョンを自動的にマージします。これにより、ローカリゼーション率が負の影響を受けないようにします。さらに、定期的なメジャーコンパクションを実行すると、ローカリゼーション率が向上します。

Short-Circuit Local Read(デフォルトで有効)

通常、Hadoop Distributed File System(HDFS)は DataNode を介して読み取り操作を実行します。Short-Circuit Local Read を有効にして DataNode をバイパスし、クライアントがローカルデータを直接読み取ることができるようにすることができます。

Hedged Read(デフォルトで有効)

システムは Short-Circuit Local Read を優先してローカルデータを読み取ります。ただし、特殊なケースでは、ディスクの問題やネットワークの問題により、ローカル読み取り操作が短時間失敗する場合があります。Hedged Read 操作は、この問題を解決するために開発されました。Hedged Read の基本的な動作原理は次のとおりです。クライアントがローカル読み取りリクエストを開始し、一定時間後に結果が返されない場合、クライアントは DataNode に同じリクエストを送信します。結果が返された場合、後続の結果はすべて破棄されます。

スワップの無効化(デフォルトで無効)

物理メモリが不足している場合、ハードディスク領域の一部がスワップとして使用されます。この操作により、レイテンシが高くなる可能性があります。ApsaraDB for HBase では、スワップはデフォルトで無効になっています。ただし、スワップを無効にすると anon-rss が高くなり、ページ再利用操作で十分なページを再利用できなくなります。これにより、カーネルが応答しなくなる可能性があります。このため、ApsaraDB for HBase は、この状況を回避するための関連する分離対策を講じています。