为Hbase中的大扫描禁用块缓存

为Hbase中的大扫描禁用块缓存,hbase,Hbase,我一直在读关于我应该在Hbase中禁用块缓存以进行大扫描的文章。我认为这是因为您在大扫描中获得了更好的性能,因为您不使用GC,并且节省了加载块缓存的时间,但我阅读了基准测试,其中人们获得了大致相同的性能 我认为如果我不使用blockcache,我应该获得时间,因为GC不需要经常执行。我也从Cloudera那里找到了一个关于这个问题的问题,我真的不喜欢这个测试问题的任何可能的回答,我想这应该是事实。 那么,如果禁用块缓存,是否可以获得更好的大(完整表)扫描性能?原因是什么 Hbase有两种缓存结构

我一直在读关于我应该在Hbase中禁用块缓存以进行大扫描的文章。我认为这是因为您在大扫描中获得了更好的性能,因为您不使用GC,并且节省了加载块缓存的时间,但我阅读了基准测试,其中人们获得了大致相同的性能

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

Hbase有两种缓存结构

  • 记忆库
  • 块缓存
  • 记忆库 用于写作。 HBase在将值作为新的存储文件写入磁盘之前,使用memStore缓冲这些值

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


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

    如果在启用块缓存的情况下扫描大型表,则数据将缓存在内存中。由于整个表无法放入缓存,GC将频繁执行,这可能会降低性能

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

    • 每次读取都会检查缓存中的数据并进行磁盘I/O,然后缓存数据(不再使用)
    • 当块缓存已满时,必须进行清理
    这将增加内存和CPU的使用,从而降低性能


    块缓存提高了频繁读取相同数据时的性能。这对大表扫描没有帮助。

    在执行全表扫描时,建议设置
    setBlockCacheEnabled(false)因为整个表无法放入块缓存