HBase扫描性能

时间:2014-03-20 09:41:24

标签: caching hadoop hbase database-scan

我正在执行范围扫描,它给了我500k记录。 如果我设置scan.setCaching(100000)只需不到一秒钟,但如果未设置scan.setCaching(100000),则花费将近38秒。

如果我设置scan.setBlockCache(false)scan.setCaching(100000)将会发生什么?这些行是否会被缓存?

我在第一次扫描后丢弃了操作系统缓存,但扫描记录的时间没有变化。为什么呢?

然后我该如何检查读取性能?

2 个答案:

答案 0 :(得分:15)

Scan.setCaching用词不当。它应该被称为Scan.setPrefetch之类的东西。 setCaching实际上指定了每个RPC向regionserver传输的行数。如果您使用setCaching(1),则每次拨打next()时,都需要支付往返于区域服务器的费用。将其设置为较大的数字的缺点是您需要为客户端支付额外的内存,并且可能会获取您不会使用的行,例如,如果您在达到一定数量的内容后停止扫描行或您找到特定值后。

Scan.setBlockCache意味着像钱德拉所指出的完全不同的东西。它基本上指示regionserver不将任何数据从此Scan中提取到HBase BlockCache,后者是MemStore的单独内存池。请注意,MemStores用于写入,而BlockCache用于读取,而这两个内存是完全分开的。 HBase目前不使用BlockCache作为回写缓存。您可以使用hfile.block.cache.size中的hbase-site.xml配置设置来控制块缓存的大小。同样,您可以通过hbase.regionserver.global.memstore.size设置控制MemStore的总池大小。

如果您正在进行全表扫描,并且您不想在块缓存中刷新当前工作集,则可能需要使用setBlockCache(false)。否则,如果您正在扫描经常使用的数据,最好不要单独留下setBlockCache

答案 1 :(得分:5)

Hbase有两种类型的缓存结构 - memory storeblock cache内存存储实现为MemStore,用于读取的缓存是块缓存 。从HDFS读取数据块时,它会缓存在BlockCache中。稍后从BlockCache中提取相邻数据的后续读取。
因此,当您手动设置scan.set Block Cache(false)时,它将停止缓存从hdfs读取的行。
scan.set-caching(100000)是客户端与扫描仪相关的优化。所以它仍然可以不受影响地工作

相关问题