主要内容:三角选择原则与近似聚合算法,cardinality去重算法,percentiles百分比算法
1、三角选择原则与近似聚合算法
1、易并行聚合算法:max
有些聚合分析的算法,是很容易就可以并行的,比如说max
不易并行的算法:distinct
有些聚合分析的算法,是不好并行的,比如说,count(distinct),并不是说,在每个node上,直接就出一些distinct value,就可以的,因为数据可能会很多
es会采取近似聚合的方式,就是采用在每个node上进行近估计的方式,得到最终的结论,cuont(distcint),100万,1050万/95万 --> 5%左右的错误率
近似估计后的结果,不完全准确,但是速度会很快,一般会达到完全精准的算法的性能的数十倍
2、三角选择原则
精准+实时+大数据 --> 选择2个
(1)精准+实时: 没有大数据,数据量很小,那么一般就是单击跑,随便你则么玩儿就可以
(2)精准+大数据:hadoop,批处理,非实时,可以处理海量数据,保证精准,可能会跑几个小时
(3)大数据+实时:es,不精准,近似估计,可能会有百分之几的错误率
3、近似聚合算法
如果采取近似估计的算法:延时在100ms左右,0.5%错误
如果采取100%精准的算法:延时一般在5s~几十s,甚至几十分钟,几小时, 0%错误
2、cardinality去重算法
ES去重,cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)
GET /tvs/_search
{
"size" : 0,
"aggs" : {
"months" : {
"date_histogram": {
"field": "sold_date",
"calendar_interval": "month"
},
"aggs": {
"distinct_brands" : {
"cardinality" : {
"field" : "brand" ##对品牌字段去重,统计每月销售的品牌数量
}
}
}
}
}
}
3、cardinality算法之优化内存开销以及HLL算法
cardinality,5%的错误率,性能在100ms左右
3.1、precision_threshold优化准确率和内存开销
GET /tvs/_search
{
"size": 0,
"aggs": {
"distinct_brand": {
"cardinality": {
"field": "brand",
"precision_threshold": 100
}
}
}
}
cardinality算法,会占用precision_threshold * 8 byte 内存消耗,100 * 8 = 800个字节,占用内存很小。
而且unique value如果的确在precision_threshold 的值以内,那么可以确保100%准确。
当precision_threshold=100时,数百万的unique value,错误率在5%以内
precision_threshold,值设置的越大,占用内存越大,可以确保更多unique value的场景下,100%的准确
3.2、HyperLogLog++ (HLL)算法性能优化
cardinality底层算法:HLL算法,HLL算法的性能
会对所有的uqniue value取hash值,通过hash值近似去求distcint count,误差
默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,取hash值; 将取hash值的操作,前移到建立索引的时候
PUT /tvs2
{
"mappings": {
"properties": {
"brand": {
"type": "text",
"fields": {
"hash": {
"type": "murmur3" ##报错 no handler for type [murmur3] declared on field [hash]
}
}
}
}
}
}
GET /tvs/_search
{
"size": 0,
"aggs": {
"distinct_brand": {
"cardinality": {
"field": "brand.hash",
"precision_threshold": 100
}
}
}
}
4、percentiles百分比算法以及网站访问时延统计
需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99
tp50:50%的请求的耗时最长在多长时间
tp90:90%的请求的耗时最长在多长时间
tp99:99%的请求的耗时最长在多长时间
搭建舞台:
PUT /website
{
"mappings": {
"properties": {
"latency": {
"type": "long"
},
"province": {
"type": "keyword"
},
"timestamp": {
"type": "date"
}
}
}
}
POST /website/_bulk
{ "index": {}}
{ "latency" : 105, "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 83, "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 92, "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 112, "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 68, "province" : "江苏", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 76, "province" : "江苏", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 101, "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 275, "province" : "新疆", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 166, "province" : "新疆", "timestamp" : "2016-10-29" }
{ "index": {}}
{ "latency" : 654, "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 389, "province" : "新疆", "timestamp" : "2016-10-28" }
{ "index": {}}
{ "latency" : 302, "province" : "新疆", "timestamp" : "2016-10-29" }
percentiles查询01:
GET /website/_search
{
"size": 0,
"aggs": {
"latency_percentiles": {
"percentiles": { ## percentiles查询
"field": "latency",
"percents": [
50,
95,
99
]
}
},
"latency_avg": {
"avg": {
"field": "latency" ## 查询平均时延
}
}
}
}
50%的请求,数值的最大的值是多少,不是完全准确的
percentiles查询02:
GET /website/_search
{
"size": 0,
"aggs": {
"group_by_province": {
"terms": {
"field": "province" ##对省进行分组
},
"aggs": {
"latency_percentiles": {
"percentiles": {
"field": "latency",
"percents": [
50,
95,
99
]
}
},
"latency_avg": {
"avg": {
"field": "latency"
}
}
}
}
}
}
5、percentile ranks metric
我们的网站的提供的访问延时的SLA,确保所有的请求100%,都必须在200ms以内.
需求:在200ms以内的,有百分之多少,在1000毫秒以内的有百分之多少,
这个percentile ranks,其实比pencentile还要常用
比如:按照品牌分组,计算,电视机,售价在1000的占比,2000的占比,3000的占比
查询实战
GET /website/_search
{
"size": 0,
"aggs": {
"group_by_province": {
"terms": {
"field": "province"
},
"aggs": {
"latency_percentile_ranks": {
"percentile_ranks": {
"field": "latency",
"values": [
200,
1000
]
}
}
}
}
}
}
网友评论