HBase扫描性能

10

我正在执行一个范围扫描,它给了我500k条记录。如果我设置scan.setCaching(100000),那么只需要不到1秒的时间,但是如果没有设置scan.setCaching(100000),则需要将近38秒。

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

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

那么如何检查读取性能?

2个回答

22

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 保留为默认值。


Scan.setCaching(HBASECACHING)用于设置缓存的行数,其中HBASECACHING指定要缓存的行数。 - Kenry Sanchez

6

Hbase有2种缓存结构——内存存储器块缓存
内存存储器实现为MemStore,而读取时使用的缓存是块缓存。当从HDFS中读取数据块时,它会被缓存在BlockCache中。随后读取相邻的数据只需从BlockCache中提供即可。
因此,当你手动设置scan.set Block Cache(false)时,它将停止缓存从HDFS读取的行。
scan.set-caching(100000)是与扫描仪相关的客户端优化。因此它仍将不受影响地工作。


3
setCaching 会影响客户端行为,而 setBlockCache 会影响RegionServer的行为,因此你认为 setCaching 不会产生任何影响的推论是不正确的。 - b4hand
@b4hand,感谢您指出这一点。我之前忽略了这个事实。请看一下我的修改后的答案。 - Chandra kant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接