德鲁伊:它如何使用缓存和OS页面缓存?

时间:2018-07-02 10:15:36

标签: bigdata druid

我发现Druid查询性能可以从以前的查询中受益。因此,我试图了解原因。 我知道Druid使用缓存(我在Broker中使用缓存),但是此缓存仅存储每个段查询的结果(对吗?)。但是,我注意到,如果后续查询使用相同的段,则性能会提高。

示例:

  1. 从表x中选择sumsum(度量),dimteste2,dimteste3,其中dimteste ='x'按dimteste2,dimteste3分组-> 2秒
  2. 从表x中选择sum(metric),dimteste2,dimteste3,其中dimteste3 ='y'按dimteste2,dimteste3分组-> 0.5秒

我搜索发现此行为可以通过OS页面缓存来实现。根据我的研究,我认为Druid在第一次查询数据源的过程中会将必要的段加载到内存(OS页面缓存)中。并且在下一个查询中可以更快地读取这些段。

我是对的吗? 我查看了Druid文档,但找不到任何有用的信息。

您能帮我解释一下这种令人敬畏的行为吗?

最诚挚的问候,

何塞·科雷亚(JoséCorreia)

1 个答案:

答案 0 :(得分:1)

Druid确实使用缓存来提高各个级别的性能。在历史记录的段级别,在代理的德鲁伊查询级别。您提供的内存越多,它的工作速度就越快。

以下是有关缓存的文档-

查询缓存

Druid支持通过LRU缓存进行查询结果缓存。结果与给定查询的参数一起按段存储。这样,德鲁伊就可以部分基于缓存中的细分结果以及部分基于扫描历史/实时细分的细分结果来返回最终结果。

段结果可以存储在本地堆缓存中,也可以存储在外部分布式键/值存储中。细分查询缓存可以在“历史记录”和“代理”级别上启用(不建议在两者上都启用缓存)。

代理上的查询缓存

与在“历史记录”中为小型集群启用查询缓存相比,在代理上启用缓存可以产生更快的结果。对于较小的生产集群(<20个服务器),建议使用此设置。请注意,在代理上启用缓存后,“历史记录”的结果将按每个细分返回,并且“历史记录”将无法进行任何本地结果合并。

历史记录上的查询缓存

较大的生产集群应仅在历史记录上启用缓存,以避免必须使用Broker合并所有查询结果。启用历史记录而不是代理缓存,可以使历史记录执行自己的本地结果合并,并减轻代理的负担。

  

Druid代理不会直接在OS页面缓存中执行任何操作,如果   操作系统提供了比基于内存更大的虚拟内存   要求分配堆。