我正在执行范围扫描,它给了我500k记录。
如果我设置scan.setCaching(100000)
只需不到一秒钟,但如果未设置scan.setCaching(100000)
,则花费将近38秒。
如果我设置scan.setBlockCache(false)
和scan.setCaching(100000)
将会发生什么?这些行是否会被缓存?
我在第一次扫描后丢弃了操作系统缓存,但扫描记录的时间没有变化。为什么呢?
然后我该如何检查读取性能?
答案 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 store
和block cache
。内存存储实现为MemStore,用于读取的缓存是块缓存 。从HDFS读取数据块时,它会缓存在BlockCache中。稍后从BlockCache中提取相邻数据的后续读取。
因此,当您手动设置scan.set Block Cache(false)时,它将停止缓存从hdfs读取的行。
scan.set-caching(100000)是客户端与扫描仪相关的优化。所以它仍然可以不受影响地工作