我一直在阅读我应该在Hbase中禁用大块扫描的阻塞缓存。我认为这是因为你在大型扫描中获得了更好的性能,因为你不使用GC并节省了加载块缓存所花费的时间,但我阅读了人们获得相同性能的基准。
我认为如果我不使用blockcache,我应该获得时间,因为GC不必经常执行。我从Cloudera那里找到了一个关于这个问题的问题,我真的不喜欢测试问题的任何可能的回答,我想这应该是事实。 那么,如果你禁用了blockcache,你会获得更好的大型(全表)扫描性能吗?是什么原因?
答案 0 :(得分:6)
Hbase有两个缓存结构
用于写作。 HBase使用memStore缓冲值,然后将它们作为新的存储文件写入磁盘。
用于阅读。 每个HBase区域服务器都有一个块缓存,可以有效地保留最近访问的内容 随后读取连续信息的数据。
由于HBase读取整个数据块以实现高效的I / O使用,因此它会保留这些块 在块缓存中,以便后续读取不需要任何磁盘操作。
如果要扫描启用了块缓存的大型表,则数据将缓存在内存中。由于整个表格不适合缓存,因此GC会频繁执行,这可能会降低性能。
如果您不打算一次又一次地读取相同的数据,则缓存它是没有用的。在这种情况下,启用块缓存只会降低性能
这会增加内存和CPU的使用,从而降低性能。
块缓存可在频繁读取相同数据时提高性能。它对大型表格扫描没有帮助。
答案 1 :(得分:3)
执行全表扫描时,建议设置setBlockCacheEnabled(false);
,因为整个表不适合块缓存。