参考 http://druid.io/docs/0.12.1/design/ 具体的例子
Segment sampleData_2011-01-01T01:00:00:00Z_2011-01-01T02:00:00:00Z_v1_0 contains
timestamp publisher advertiser gender country click price
2011-01-01T01:01:35Z bieberfever.com google.com Male USA 0 0.65
2011-01-01T01:03:63Z bieberfever.com google.com Male USA 0 0.62
2011-01-01T01:04:51Z bieberfever.com google.com Male USA 1 0.45
2011-01-01T01:00:00Z ultratrimfast.com google.com Female UK 0 0.87
2011-01-01T02:00:00Z ultratrimfast.com google.com Female UK 0 0.99
2011-01-01T02:00:00Z ultratrimfast.com google.com Female UK 1 1.53
在例子数据中的各种单独的数据不是很有意义,因为这样的数据有万亿级别。但是这样数据的汇总结果却可以产出有价值的信息。Druid 会使用一个称之为 roll-up的程序在数据读入的时候进行汇总。roll-up是对于选定的所有dimensions 进行一级聚合,用伪代码标识就是 :
GROUP BY timestamp, publisher, advertiser, gender, country
:: impressions = COUNT(1), clicks = SUM(click), revenue = SUM(price)
原始数据聚合后的结果形式如下:
timestamp publisher advertiser gender country impressions clicks revenue
2011-01-01T01:00:00Z ultratrimfast.com google.com Male USA 1800 25 15.70
2011-01-01T01:00:00Z bieberfever.com google.com Male USA 2912 42 29.18
2011-01-01T02:00:00Z ultratrimfast.com google.com Male UK 1953 17 17.31
2011-01-01T02:00:00Z bieberfever.com google.com Male UK 3194 170 34.01
现实情况下,我们可以看到 rolling up 数据可以极大的减少需要存储的数据大小(多达 100倍),druid 将会在数据读入的时候进行roll up 以减少需要存储数据的大小。存储数据量的减少也会有一定的副作用,就是我们无法查询单独的数据了。换句话说,rollup的粒度是你可以获取数据的最小粒度并且数据按照这个粒度存储。因而,druid 读入的说明定义 granularity 为 数据的查询粒度。最小的查询粒度是ms级别。
Roll-up 方式
Druid 支持两种方式,perfect roll-up 和 best-effort roll-up. perfect roll-up 方式,Druid 保证数据在读入的时候就会被 完美 聚合。然而 best-effort roll-up 并不会 完美聚合 ,因此 多个segements 会包含多行数据,而这些数据在 perfect roll-up 中 属于同一个segment。因为这些行具有相同的维度值,并且时间戳落在相同的时间窗口内。
perfect roll-up 方式 在数读入的时候如果没有指定一个ingestionSpec 会 包含一个额外的预处理步骤去决定时间窗口和分片。这个预处理的步骤通常会扫毛所有的数据,这样才会产生读入的时间。
相反的, best-effort roll-up 不需要预处理步骤,但是读入的数据会大于 perfect roll-up。
All types of streaming indexing (i.e., realtime index task, kafka indexing service, ...) run with this mode.
最后, the native index task 支持两种方式,你可以选择适合你应用的任何一个。
网友评论