Caching HBase扫描性能

Caching HBase扫描性能,caching,hadoop,hbase,database-scan,Caching,Hadoop,Hbase,Database Scan,我正在执行一个范围扫描,它会给我500k的记录。 如果我设置了scan.setCaching(100000)不到一秒钟,但是如果没有设置scan.setCaching(100000),则需要将近38秒 如果我设置了scan.setBlockCache(false)和scan.setCaching(100000)会发生什么?行是否会被缓存 我在第一次扫描后删除操作系统缓存,但扫描记录的时间没有变化。为什么? 那么如何检查读取性能 Hbase有两种类型的缓存结构-内存存储和块缓存内存存储实现为Mem

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

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

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


那么如何检查读取性能

Hbase有两种类型的缓存结构-
内存存储
块缓存

内存存储实现为MemStore,用于读取的缓存为块缓存。
从HDFS读取数据块时,数据块缓存在块缓存中。相邻数据的后续读取仅从块缓存提供服务
因此,当您手动设置scan.set Block Cache(false)时,它将停止缓存从hdfs读取的行。
scan.set caching(100000)是与扫描仪相关的客户端优化。因此,它仍然可以不受影响地工作。

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

Scan.setBlockCache
的意思与钱德拉指出的完全不同。它基本上指示regionserver不要将此扫描中的任何数据拉入HBase BlockCache,这是与MemStore分离的内存池。请注意,MemStores用于写入,BlockCache用于读取,这两块内存是完全分开的。HBase当前未将块缓存用作回写缓存。您可以使用
hbase site.xml
中的
hfile.block.cache.size
config设置来控制块缓存的大小。类似地,您可以通过
hbase.regionserver.global.MemStore.size
设置来控制MemStore的总池大小


如果正在执行完整表扫描,并且不希望刷新块缓存中的当前工作集,则可能需要使用
setBlockCache(false)
。否则,如果您正在扫描频繁使用的数据,最好不要使用
setBlockCache

setCaching
影响客户端行为,而
setBlockCache
影响区域服务器端行为,所以你为什么
setCaching
不会有任何效果的推理是错误的。@b4hand,谢谢你指出我的观点。我忽略了这个事实。查看我更改的答案.Scan.setCaching(HBASECACHING),其中
HBASECACHING
指定要缓存的行数