Elasticsearch高手进阶篇(47)
深入聚合数据分析_易并行聚合算法,三角选择原则,近似聚合算法
画图讲解易并行聚合算法:max
-
有些聚合分析的算法,是很容易就可以并行的,比如说max
-
有些聚合分析的算法,是不好并行的,比如说,count(distinct),并不是说,在每个node上,直接就出一些distinct value,就可以的,因为数据可能会很多
自我理解:
- 易于并行的数据,以max为例,当我们的请求从候选节点发送到所有的shard上的时候,我们的数据在shard上进行max,并将各个shard上的max数据返回给候选节点,最终在候选节点的部分在对各个shard的max的值进行max操作,得到最大的max搜索数据。
- 不易于并行的数据,以count(distinct)为例,当我们的请求从候选节点发送到所有的shard上的时候,我们的数据执行去重的操作(假设去完重之后还有100万的数据),并将各个shard上的100万数据返回给候选节点,最终在候选节点有shard * 100万的数据,在对候选节点进行count(distinct)去重,得到最后的去重搜索数据。
es会采取近似聚合的方式,就是采用在每个node上进行近估计的方式,得到最终的结论
-
count(distcint),100万,1050万/95万 --> 5%左右的错误率
-
近似估计后的结果,不完全准确,但是速度会很快,一般会达到完全精准的算法的性能的数十倍
三角选择原则
精准+实时+大数据 --> 选择2个
- 精准+实时: 没有大数据,数据量很小,那么一般就是单击跑,随便你则么玩儿就可以
- 精准+大数据:hadoop,批处理,非实时,可以处理海量数据,保证精准,可能会跑几个小时
- 大数据+实时:es,不精准,近似估计,可能会有百分之几的错误率
近似聚合算法
- 如果采取近似估计的算法:延时在100ms左右,0.5%错误
- 如果采取100%精准的算法:延时一般在5s~几十s,甚至几十分钟,几小时, 0%错误
Elasticsearch高手进阶篇(48)
深入聚合数据分析_cardinality去重算法以及每月销售品牌数量统计
cartinality
- es,去重,
cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)
GET /waws_tvs/sales/_search
{
"size" : 0,
"aggs" : {
"months" : {
"date_histogram": {
"field": "sold_date",
"interval": "month"
},
"aggs": {
"distinct_colors" : {
"cardinality" : {
"field" : "brand"
}
}
}
}
}
}
{
"took": 54,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 8,
"max_score": 0,
"hits": []
},
"aggregations": {
"months": {
"buckets": [
{
"key_as_string": "2016-05-01T00:00:00.000Z",
"key": 1462060800000,
"doc_count": 1,
"distinct_colors": {
"value": 1
}
},
{
"key_as_string": "2016-06-01T00:00:00.000Z",
"key": 1464739200000,
"doc_count": 0,
"distinct_colors": {
"value": 0
}
},
{
"key_as_string": "2016-07-01T00:00:00.000Z",
"key": 1467331200000,
"doc_count": 1,
"distinct_colors": {
"value": 1
}
},
{
"key_as_string": "2016-08-01T00:00:00.000Z",
"key": 1470009600000,
"doc_count": 1,
"distinct_colors": {
"value": 1
}
},
{
"key_as_string": "2016-09-01T00:00:00.000Z",
"key": 1472688000000,
"doc_count": 0,
"distinct_colors": {
"value": 0
}
},
{
"key_as_string": "2016-10-01T00:00:00.000Z",
"key": 1475280000000,
"doc_count": 1,
"distinct_colors": {
"value": 1
}
},
{
"key_as_string": "2016-11-01T00:00:00.000Z",
"key": 1477958400000,
"doc_count": 2,
"distinct_colors": {
"value": 1
}
},
{
"key_as_string": "2016-12-01T00:00:00.000Z",
"key": 1480550400000,
"doc_count": 0,
"distinct_colors": {
"value": 0
}
},
{
"key_as_string": "2017-01-01T00:00:00.000Z",
"key": 1483228800000,
"doc_count": 1,
"distinct_colors": {
"value": 1
}
},
{
"key_as_string": "2017-02-01T00:00:00.000Z",
"key": 1485907200000,
"doc_count": 1,
"distinct_colors": {
"value": 1
}
}
]
}
}
}