在Hbase中禁用大型扫描的阻止缓存

时间:2014-04-09 20:42:15

标签: hbase

我一直在阅读我应该在Hbase中禁用大块扫描的阻塞缓存。我认为这是因为你在大型扫描中获得了更好的性能,因为你不使用GC并节省了加载块缓存所花费的时间,但我阅读了人们获得相同性能的基准。

我认为如果我不使用blockcache,我应该获得时间,因为GC不必经常执行。我从Cloudera那里找到了一个关于这个问题的问题,我真的不喜欢测试问题的任何可能的回答,我想这应该是事实。 那么,如果你禁用了blockcache,你会获得更好的大型(全表)扫描性能吗?是什么原因?

2 个答案:

答案 0 :(得分:6)

Hbase有两个缓存结构

  1. 那种MEMSTORE
  2. BlockCache
  3. 那种MEMSTORE

    用于写作。 HBase使用memStore缓冲值,然后将它们作为新的存储文件写入磁盘。

    阻止缓存

    用于阅读。 每个HBase区域服务器都有一个块缓存,可以有效地保留最近访问的内容 随后读取连续信息的数据。


    由于HBase读取整个数据块以实现高效的I / O使用,因此它会保留这些块 在块缓存中,以便后续读取不需要任何磁盘操作。

    如果要扫描启用了块缓存的大型表,则数据将缓存在内存中。由于整个表格不适合缓存,因此GC会频繁执行,这可能会降低性能。

    如果您不打算一次又一次地读取相同的数据,则缓存它是没有用的。在这种情况下,启用块缓存只会降低性能

    • 每次读取检查缓存中的数据并进入磁盘I / O,数据被缓存(不会再次使用)
    • 当Block缓存已满时,必须进行清理。

    这会增加内存和CPU的使用,从而降低性能。

    块缓存可在频繁读取相同数据时提高性能。它对大型表格扫描没有帮助。

答案 1 :(得分:3)

执行全表扫描时,建议设置setBlockCacheEnabled(false);,因为整个表不适合块缓存。