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

ipakzgxi  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(791)

我是 Impala 的新手,我在 Impala 上做了一些测试。当我第二次调用时,我发现类似的sql要快得多。
例如:
表1=4b行
表2=50m行
第一个查询: select * from table1 where id in (select id from table2 where < 10000) (20秒)
第二个问题: select * from table1 where id in (select id from table2 where < 9999) (10秒)
第三个问题: select * from table1 where id in (select id from table2 where < 100) (1秒)
我想 Impala 做了一些特殊的贮藏,有人能告诉我它的原因吗?
谢谢。

aelbi1ox

aelbi1ox1#

当我在一个用户组邮件列表上发布了一个关于这个的问题时,cloudera的jean-danielcryans解释说这可能是由于os页面缓存造成的。第一次访问时,操作系统会将磁盘中的数据缓存在其页缓存中。命中以前没有读取过的表的查询将导致从磁盘读取数据,而已经预加载到页缓存的表从ram中获取数据的速度要快得多。我们在本地impala查询中也观察到了同样的情况。我们运行了一些测试,重新启动了impala和/或kudu,并可以通过重置页面缓存来重现这一点。因此,我们分别测量了页面缓存重置后第一次运行的执行时间,以及第一次运行后连续3次运行的执行时间。测试重复3次,为每个循环回收缓存。
换句话说,impala不缓存查询的结果,只缓存磁盘中的文件,它必须使用这些磁盘来处理查询。

olmpazwi

olmpazwi2#

impala使用操作系统的缓存和额外的hdfs缓存。
将hdfs缓存与impala结合使用的摘录:
“linux操作系统缓存[…]只在内存中保存最近使用的数据。从hdfs缓存读取的数据避免了使用linux操作系统缓存中的数据时所涉及的校验和以及内存到内存复制的开销。”
这可能解释了第一次和第二次查询之间执行时间的差异。但是,第三次查询比前两次快得多的原因可能不仅仅是缓存,而是它只查询大约1/100的数据(假设是均匀分布的)。

相关问题