本文共 3423 字,大约阅读时间需要 11 分钟。
Druid 是 Metamarkets 公司(一家为在线媒体或广告公司提供数据分析服务的公司)推出的一个分布式内存实时分析系统,用于解决如何在大规模数据集下进行快速的、交互式的查询和分析。现今有一些非常热的 SQL on Hadoop 解决方案或者基于传统数据库技术的 MPP 方案,前者比如 Hive、Impala、Spark SQL、Presto 等,后者比如 Greenplum。这些方案的查询响应速度往往与数据集的规模成正比,查询时延从秒级到天级不等。这对于想要快速验证想法的业务人员来说是个极大的问题。与这些系统不同,Druid 通过预先聚合一些维度来换取速度,查询时延可以控制在秒亚秒级到秒级。这非常适合那些业务数据维度比较固定,又对查询时延要求非常高的场景,比如
这些场景的特点都是拥有大量的数据,且对数据查询的时延要求非常高。例如在广告程序化交易中,广告平台的出价策略来源于广告流量数据的分析,整个过程要求实时,因为市场变动很快,根据第一天的流量计算第二天的出价是没有意义的,这里的联动需要做到秒级。实时指标监控类似,在一些重要的场合,系统问题需要在出现的一刻被检测到并被反馈随后被解决。在推荐系统或者用户行为分析系统中,模型需要在多个维度分析数据提炼用户行为,并及时更新到线上系统。
其中最为亮眼的是第一条与第二条。开源界能够同时做到两者的系统或解决方案并不多见,主要竞争者有 LinkedIn 公司的 Pinot,eBay 公司的 Kylin,以及 Elasticsearch 等。我们下文有专门的对比。
下图是 Druid 工作层(数据索引以及查询)包含的组件。其中,
Indexing service 包含两个组件(图中未画出)
下图是 Druid segments(Druid 索引文件)管理层所涉及的组件。其中
三者均是基于预计算换取查询时延。Druid 与 Pinot 是比较类似的,Kylin 是另外一种。Kylin 实际上是一个预聚合生成 cube 的一个系统。它的数据导入并不是实时的,需要设置定时任务做聚合计算,生成 cube,因此它本质上是一个 cube 生成与管理系统。cube 是一个数据的多维立方体,当维度增多之后 cube 体积会迅速增大。但是在不同的维度间切换视角、或是执行上卷、下钻等操作会非常省时。
Druid 与 Pinot 都是 lambda 架构,既可以通过批处理历史数据,又可以通过流实时处理数据。下表列出了两者在主要维度上的对比
Pinot | Druid | |
---|---|---|
发起者 | MetaMarkets | |
发布年份 | 2015 | 2011 |
架构 | lambda 架构 | lambda 架构 |
存储方式 | 列存 | 列存 |
索引类型 | inverted/start tree/bitmap | inverted |
消费数据格式 | avro/csv/json(historical), Kafka(realtime) | json/csv/tsv/regex(any custom data format), stream(rest), Kafka |
组件管理 | Zookeeper+Helix | Zookeeper |
文档支持 | 一般 | 好 |
SQL 支持 | PQL | Druid SQL |
JDBC | 不支持,但其java api 类似于jdbc | 通过 avatica jdbc driver 支持 |
Elasticsearch (ES) 是一个基于 Lucenen 的搜索引擎系统,原先主要应用于搜索领域,后来加入了聚合等特性,支持了更多的查询类型,从而变成了一个 NoSQL 的数据库。它是从搜索引擎而来,因此具有一些搜索引擎所具有的特点,同时由于其基于搜索的设计,也导致了一些场景下的短板。
ES 的优点主要在于
ES 的缺点有
Druid 与 ES 是两种技术上完全不同的方案。前者基于数据的预计算换取查询时延,后者则是完全基于倒排索引。Druid 相对于 ES 的优势在于
由于两者都具有鲜明的特点,因此针对具体场景选择哪种方案就不存在什么选择困难。对于半结构化的日志分析,ELK 可能更好一些。对于结构化的数据又有实时性的要求的话,Druid 是更好的选择。
Druid 具有高超的性能。主要体现在:一,很高的水平扩展能力,能够处理极大的数据集;二,预聚合带来的自然加速优势;三,基于内存的计算保证了计算的速度;四,从 deep storage 到磁盘再到内存形成了一个多级缓存架构,热数据能够快速被处理。
下表列出了 Metamarkets 公司 Druid 集群的一些性能指标
转载地址:http://zqlhx.baihongyu.com/