德鲁伊与弹性搜索

druid vs Elasticsearch

我是德鲁伊新手。我已经看过"druid VS Elasticsearch",但我仍然不知道德鲁伊擅长什么

下面是我的问题:

  1. 我有一个有 70 个节点的 solr 集群。

  2. 我在solr中有一个非常大的table,它有10亿行,每行有100个字段。

  3. 用户会使用字段的不同组合范围查询(一次查询至少20个组合)来统计customer id的distinct个数,但是solr的distinct count算法很慢,使用了一个大量内存,所以如果查询结果超过20万,solr的查询节点会崩溃。

druid 在不同的计数上是否比 solr 有更好的性能?

Druid 与 ES/Solr 等特定于搜索的数据库有很大不同。它是一个专为分析而设计的数据库,您可以在其中进行汇总、列过滤、概率计算等。

Druid 通过使用 HyperLogLog(一种概率数据结构)来实现不同计数。因此,如果您不担心 100% 的准确性,您绝对可以尝试 Druid,我已经在我的一个项目中看到了响应时间的显着改进。但是,如果你关心准确性,那么 Druid 可能不是最好的解决方案(即使在 Druid 中也很可能实现,性能下降和额外的 space 被占用) - 在此处查看更多信息:https://groups.google.com/forum/#!topic/druid-development/AMSOVGx5PhQ

ES 通常需要原始数据,因为它专为搜索而设计。这意味着索引很大但嵌套聚合很昂贵。 (我知道我在这里跳过了很多细节)。

Druid 专为时间序列数据的度量计算而设计。它具有明确的维度和指标区分。基于维度字段,度量字段在摄取时预先聚合。此步骤有助于根据维度数据的基数减少大量数据。换句话说,当维度是分类值时,Druid 效果最好。

您提到了 range query。指标的范围过滤器效果很好。但是,如果你的意思是通过数字维度进行查询,那是 Druid 仍在进行中的事情。

关于distinct count,ES和Druid都支持HyperLogLog。在 Druid 中,您必须在摄取时指定字段,以便在查询时应用 HyperLogLog。它非常快速和高效。

Elasticsearch 的最新版本 (6.x AFAIK) 支持您的用例,您将从所有 3 个(Druid、ES、Solr)中获得结果,但要回答关于性能的最后一个问题,我觉得 Druid对于您的用例,将是性能最高且资源需求最少的。

虽然 ES 支持分析和聚合,但它的主要设计是基于自由文本搜索需求。由于 ES 做的事情比你上面提到的要多,它会占用资源并且可能不适合,除非你想做的不仅仅是非重复计数。

引用自德鲁伊的网站https://druid.apache.org/docs/latest/comparisons/druid-vs-elasticsearch.html

Druid focuses on OLAP workflows. Druid is optimized for high performance (fast aggregation and ingestion) at low cost and supports a wide range of analytic operations.