[英]Could I can improve HBase reading performance by using Redis as cache?
[英]HBase Scan Performance
我正在执行范围扫描,它给了我500k记录。 如果我设置scan.setCaching(100000)
它花了不到一秒钟,但如果没有设置scan.setCaching(100000)
则需要将近38秒。
如果我设置scan.setBlockCache(false)
和scan.setCaching(100000)
会发生什么? 这些行是否会被缓存?
我在第一次扫描后丢弃了操作系统缓存,但扫描记录的时间没有变化。 为什么?
那我该如何检查读取性能呢?
Scan.setCaching
是用词不当。 它应该被称为Scan.setPrefetch
。 setCaching
实际上指定了每个RPC向regionserver传输的行数。 如果您使用setCaching(1)
那么每次调用next()
您都需要支付往返于regionserver的往返费用。 将其设置为更大的数字的缺点是您需要为客户端支付额外的内存,并且可能正在获取您不会使用的行,例如,如果在达到特定数量的行后停止扫描或在找到特定值后。
Scan.setBlockCache
意味着像Chandra指出的完全不同的东西。 它基本上指示regionserver不将任何数据从此Scan中提取到HBase BlockCache,后者是MemStore的单独内存池。 请注意,MemStores用于写入,而BlockCache用于读取,而这两个内存是完全分开的。 HBase目前不使用BlockCache作为回写缓存。 您可以使用hbase-site.xml
的hfile.block.cache.size
配置设置来控制块缓存的大小。 同样,您可以通过hbase.regionserver.global.memstore.size
设置控制MemStore的总池大小。
如果您正在进行全表扫描,并且不想刷新块缓存中的当前工作集,则可能需要使用setBlockCache(false)
。 否则,如果您正在扫描经常使用的数据,那么最好不要单独使用setBlockCache
。
Hbase有两种类型的缓存结构 - memory store
和block cache
。
内存存储实现为MemStore,用于读取的缓存是块缓存 。
从HDFS读取数据块时,它将缓存在BlockCache中。 稍后从BlockCache中提取相邻数据的后续读取。
因此,当您手动设置scan.set Block Cache(false)时, 它将停止缓存从hdfs读取的行。
scan.set-caching(100000)是与扫描程序相关的客户端优化。 所以它仍然可以不受影响
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.