impala是否在查询后缓存一些数据

问题描述 投票:1回答:2

我是Impala的新手,我在Impala上做了一些测试用例。我第二次打电话时发现类似的SQL速度要快得多。

例如:

  • tablet1 = BS rovs
  • table2 = 50M行

第一个查询:select * from table1 where id in (select id from table2 where xxx < 10000)(20秒)

第二个查询:select * from table1 where id in (select id from table2 where xxx < 9999)(10秒)

第3次查询:select * from table1 where id in (select id from table2 where xxx < 100)(1秒)

我猜Impala做了一些特殊的缓存,任何人都可以告诉我它的原因吗?

谢谢。

impala
2个回答
3
投票

Impala使用操作系统的缓存和其他HDFS缓存。

来自Using HDFS Caching with Impala的摘录:

“Linux OS缓存仅将最近使用的数据保存在内存中。从HDFS缓存读取的数据避免了使用来自Linux OS缓存的数据时所涉及的校验和和内存到内存复制的开销。”

这可以解释第一次和第二次查询之间执行时间的差异。但是,你的第三个查询比前两个查询快得多的原因可能不是(仅)缓存,而是它只查询大约1/100的数据(假设xxx的均匀分布)。


1
投票

当我在用户组邮件列表上发布有关此问题时,Cloudera的Jean-Daniel Cryans解释说这可能是由于操作系统页面缓存造成的。操作系统将在第一次访问时从页面缓存中的磁盘缓存数据。命中之前未读过的表的查询将导致从磁盘读取数据,而已经预加载到页缓存的表将从RAM中获取更快。我们在本机Impala查询中观察到了同样的事情。我们运行了一些测试,重新启动Impala和/或Kudu,并可以通过重置页面缓存来重现这一点。出于这个原因,我们分别测量了页面缓存重置后第一次运行的执行时间,以及第一次运行后连续3次运行的执行时间。测试重复3次,为每个循环回收缓存。

换句话说,Impala不会缓存查询结果,而只是缓存来自必须用来处理查询的磁盘的文件。

© www.soinside.com 2019 - 2024. All rights reserved.