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

时间:2016-08-31 08:06:19

标签: impala

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

例如:

  • table1 = 4B行
  • 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秒)

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

摘自Using HDFS Caching with Impala

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

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

答案 1 :(得分:0)

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

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