我是Impala的新手,我在Impala上做了一些测试用例。 我第二次打电话时发现类似的SQL速度要快得多。
例如:
第一次查询: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会做一些特殊的缓存,任何人都可以告诉我它的原因吗?
感谢。
答案 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不会缓存查询结果,而只会缓存它必须用于处理查询的磁盘中的文件。