一、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會將時間很久的一些數據行聚合在一起,所有的查詢都需要指定查詢的時間範圍。
維度列
維度列用來標識事件的維度。
事件列
用於聚合和計算的列,是業務的量化指標。