HBase は柔軟性の高いデータベースですが、そのパフォーマンスは適切な設定と使用方法に大きく依存します。本トピックでは、読み取りパフォーマンスを最適化するためのいくつかの方法について説明します。本番環境では、フル GC、メモリ不足 (OOM) エラー、Region-In-Transition (RIT) の問題、読み取りレイテンシーの増大などの問題が発生する可能性があります。これらの問題は高性能なハードウェアで緩和できますが、最高のパフォーマンスを実現するには適切な最適化が不可欠です。
最適化は次のカテゴリに分類されます:
クライアント側の最適化、サーバー側の最適化、プラットフォームの最適化 (ApsaraDB for HBase)
クライアント側の最適化
バッチ get リクエスト
バッチリクエストは、クライアントとサーバー間の RPC コールを大幅に削減し、スループットを大幅に向上させます。
Result[] re= table.get(List<Get> gets)
大規模スキャンのキャッシュサイズの設定
大量のデータをスキャンする場合、クライアントは単一のリクエストを送信し、サーバーはデータをバッチで返します。この設計により、単一の大規模なデータ転送でクライアントまたはサーバーに過度の負荷がかかるのを防ぐことができます。デフォルトでは、データは 100 行を保持するローカルキャッシュにロードされます。大規模スキャンの場合、これにより数百から数万の RPC リクエストが発生する可能性があります。これらの操作ではキャッシュサイズを増やしてください。
scan.setCaching(int caching) // 大規模スキャンの場合、1000 に設定できます。
カラムファミリーまたはカラム修飾子の指定
HBase はカラムファミリー指向のデータベースです。同じカラムファミリー内のデータは一緒に保存され、他のファミリーとは分離されています。I/O を削減するには、リクエストで必要なカラムファミリーまたは特定のカラム修飾子を常に指定してください。
オフラインタスクのキャッシュの無効化
オフライン計算のために HBase にアクセスする場合、データは通常 1 回だけ読み取られます。再利用されないデータでブロックキャッシュが埋まってしまうのを避けるため、これらのスキャンではブロックキャッシュを無効にしてください。
scan.setBlockCache(false)
サーバー側の最適化
リクエスト負荷分散の確保
読み取り負荷が 1 台または数台のサーバーに集中していないかを確認してください。特にピーク時に注意が必要です。HBase 管理プラットフォームの HBase UI を通じて監視できます。大きなホットスポットを特定した場合、長期的な最善の解決策は rowkey を再設計することです。短期的な対処法としては、ホットリージョンを分割することを検討してください。
ブロックキャッシュサイズの設定
ブロックキャッシュは読み取りパフォーマンスにとって重要な読み取りキャッシュです。読み取り負荷の高いワークロードの場合、8 vCPU / 32 GiB や 16 vCPU / 64 GiB など、vCPU とメモリの比率が 1:4 のインスタンスを使用してください。ブロックキャッシュサイズを増やし、MemStore サイズを減らすことで、読み取りパフォーマンスを向上させることができます。
ApsaraDB for HBase コンソールで、hfile.block.cache.size を 0.5 に、hbase.regionserver.global.memstore.size を 0.3 に設定し、サービスを再起動します。
また、hbase.regionserver.global.memstore.lowerLimit を 0.24 に変更します。
HFile 数の管理
読み取り操作では HFile を開く必要があります。HFile の数が多いほど、I/O 操作が増え、読み取りレイテンシーが高くなります。これを管理するには、定期的にメジャーコンパクションを実行してください。夜間のワークロードが軽い場合は、オフピーク時にメジャーコンパクションをスケジュールしてください。
コンパクションによるリソース消費の監視
コンパクションは小さな HFile を大きな HFile にマージし、その後の読み取りパフォーマンスを向上させますが、システムリソースも大量に消費します。マイナーコンパクションは、設定に誤りがない限り、通常はリソースを大量に消費することはありません。ピーク時にメジャーコンパクションを実行しないでください。メジャーコンパクションはオフピーク時にスケジュールしてください。
ブルームフィルターの正しい使用
ブルームフィルターは、HFile に特定の行が含まれている可能性があるかどうかを判断するのに役立ち、不要な I/O 操作を回避し、読み取りパフォーマンスを向上させます。テーブルを作成する際は、BLOOMFILTER => 'ROW' を設定して、rowkey でブルームフィルターを有効にしてください。
プラットフォームの最適化
データローカリティの向上
HFile がそのデータを提供するノードと同じノードに保存されている場合、HBase はショートサーキットローカルリードを使用して高速にアクセスできます。プラットフォームは高いデータローカリティを維持するように最適化されています。再起動やディスク拡張などのイベントの後、自動的にリージョンをローカルノードに復元します。定期的なメジャーコンパクションもデータローカリティの向上に役立ちます。
ショートサーキットローカルリード (デフォルトで有効)
通常、HDFS の読み取り操作は DataNode を経由します。ショートサーキットローカルリードが有効になっている場合、クライアントは DataNode をバイパスし、ローカルディスクから直接データを読み取ることができます。
ヘッジドリード (デフォルトで有効)
システムは最初にショートサーキットローカルリードを使用してローカル読み取りを試みます。ただし、一時的なディスクまたはネットワークの問題により、ローカル読み取りが遅くなることがあります。ヘッジドリード はこの問題を軽減します。クライアントがローカル読み取りを開始すると、短いタイマーが開始されます。タイマーが切れる前に読み取りが完了しない場合、クライアントは別の DataNode に 2 番目の読み取りリクエストを送信します。クライアントは最初に受信したレスポンスを使用し、もう一方のリクエストを破棄します。
スワップ領域の無効化 (デフォルトでは無効)
スワップ領域は、物理メモリが不足している場合に仮想メモリとして使用されるハードドライブ上の一領域です。スワップ領域を使用すると大幅なレイテンシーが発生するため、ApsaraDB for HBase プラットフォームではデフォルトで無効になっています。ただし、スワップ領域を無効にすると anon-rss が高くなる可能性があり、ページ回収が十分なページを解放できず、カーネルがハングする可能性があります。プラットフォームはこれを防ぐために隔離対策を講じています。