10

500k レコードを取得する範囲スキャンを実行しています。設定scan.setCaching(100000)した場合は 1 秒もかかりませんでしたがscan.setCaching(100000)、設定していない場合は 38 秒近くかかりました。

設定するscan.setBlockCache(false)scan.setCaching(100000)どうなりますか?行はキャッシュされますか?

最初のスキャン後に OS キャッシュを削除していますが、レコードをスキャンする時間に変更はありません。なんで?

次に、読み取りパフォーマンスを確認するにはどうすればよいですか?

4

2 に答える 2

22

Scan.setCachingは誤称です。のような名前にする必要がありますScan.setPrefetchsetCaching実際には、RPC ごとにリージョンサーバーに送信される行数を指定します。使用するsetCaching(1)と、呼び出すたびnext()にリージョン サーバーへの往復のコストが発生します。より大きな数に設定することのマイナス面は、クライアントで余分なメモリを支払うことであり、たとえば、特定の行数に達した後にスキャンを停止した場合や、使用しない行をフェッチする可能性があることです。特定の値を見つけた後。

Scan.setBlockCacheチャンドラが指摘したように、まったく異なるものを意味します。これは基本的に、このスキャンから MemStore とは別のメモリ プールである HBase BlockCache にデータをプルしないようにリージョン サーバーに指示します。MemStores は書き込みに使用され、BlockCache は読み取りに使用され、これら 2 つのメモリは完全に分離されていることに注意してください。HBase は現在、BlockCache をライトバック キャッシュとして使用していません。hfile.block.cache.sizeの構成設定を使用して、ブロック キャッシュのサイズを制御できますhbase-site.xml。同様に、設定を介して MemStore の合計プール サイズを制御できhbase.regionserver.global.memstore.sizeます。

setBlockCache(false)テーブル全体のスキャンを実行していて、現在のワーキング セットをブロック キャッシュにフラッシュしたくない場合に使用します。そうではなく、頻繁に使用されるデータをスキャンしている場合は、そのままにしておいた方がよいでしょうsetBlockCache

于 2014-03-21T00:10:31.320 に答える
6

Hbase には と の 2 種類のキャッシュ構造がmemory storeありblock cacheます。
メモリ ストアは MemStore として実装され、読み取りに使用するキャッシュはブロック キャッシュです。
データ ブロックが HDFS から読み取られると、BlockCache にキャッシュされます。隣接するデータの後続の読み取りは、単純に BlockCache から提供されます。
そのため、手動で scan.set Block Cache(false) then を設定すると、hdfs から読み取った行のキャッシュが停止します。
scan.set-caching(100000) は、スキャナーに関連するクライアント側の最適化です。したがって、影響を受けずに引き続き動作します

于 2014-03-20T10:03:40.740 に答える