一、Druid设计原则
(1)快速查询能力:部分数据聚合(Partial Aggregate) + 内存化(In-Memory)+索引(Index)
(2)水平扩展能力:分布式查询(Distributed Data) + 并行化查询(Parallelizable Query)
(3)实时分析能力:不可变的过去(Immutable Past),只追加的未来(Append-Only Future)。
部分聚合:Partial Aggregate
Druid默认会对明细数据按最明细的全维度组合,以及指标,进行预先聚合。聚合方式是预定义的,聚合粒度是按时间聚合,可以是从1分钟到1天。
内存化
使用Bitmap 和各种压缩技术。
索引
通过倒排索引,加速 AND / OR
算子可并行化查询
提供可并行化查询的聚合操作,如Count,Mean,Variance等。
对于不能并行化的操作,如Median,Druid暂时不支持。
对基数的查询提供近似算法(HyperLoglog,DataSketches),以保证快速相应。
舍弃耗时的Join操作
使用druid时,其输入数据需要是串联好的宽表,因为druid不支持Join操作,以保障响应性能。同时,Druid是一种时序数据库,在入库时会按照一定的时间粒度对数据进行聚合,以加快分析查询速度。
二、Druid的基本概念
时间列
Druid会将时间很久的一些数据行聚合在一起,所有的查询都需要指定查询的时间范围。
维度列
维度列用来标识事件的维度。
事件列
用于聚合和计算的列,是业务的量化指标。