我正在执行一个范围扫描,它给了我500k条记录。如果我设置scan.setCaching(100000)
,那么只需要不到1秒的时间,但是如果没有设置scan.setCaching(100000)
,则需要将近38秒。
如果我设置scan.setBlockCache(false)
和scan.setCaching(100000)
会发生什么?行是否会被缓存?
我在第一次扫描后删除了操作系统缓存,但是扫描记录的时间没有变化。为什么?
那么如何检查读取性能?
我正在执行一个范围扫描,它给了我500k条记录。如果我设置scan.setCaching(100000)
,那么只需要不到1秒的时间,但是如果没有设置scan.setCaching(100000)
,则需要将近38秒。
如果我设置scan.setBlockCache(false)
和scan.setCaching(100000)
会发生什么?行是否会被缓存?
我在第一次扫描后删除了操作系统缓存,但是扫描记录的时间没有变化。为什么?
那么如何检查读取性能?
Scan.setCaching
这个方法名有误,应该被称为 Scan.setPrefetch
。它实际上指定了每次 RPC 向 RegionServer 传输的行数。如果使用 setCaching(1)
,则每次调用 next()
都需要支付与 RegionServer 的往返成本。将其设置为较大的数字的缺点是您需要在客户端支付额外的内存,并且可能会提取您不需要的行,例如当到达一定数量的行或找到特定值后停止扫描。
Scan.setBlockCache
是完全不同的东西,就像 Chandra 指出的那样。它基本上指示了 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
保留为默认值。
Hbase有2种缓存结构——内存存储器
和块缓存
。
内存存储器实现为MemStore,而读取时使用的缓存是块缓存。当从HDFS中读取数据块时,它会被缓存在BlockCache中。随后读取相邻的数据只需从BlockCache中提供即可。
因此,当你手动设置scan.set Block Cache(false)时,它将停止缓存从HDFS读取的行。
scan.set-caching(100000)是与扫描仪相关的客户端优化。因此它仍将不受影响地工作。
setCaching
会影响客户端行为,而 setBlockCache
会影响RegionServer的行为,因此你认为 setCaching
不会产生任何影响的推论是不正确的。 - b4hand
HBASECACHING
指定要缓存的行数。 - Kenry Sanchez