主要內(nèi)容:三角選擇原則與近似聚合算法窍荧,cardinality去重算法辉巡,percentiles百分比算法
1、三角選擇原則與近似聚合算法
1蕊退、易并行聚合算法:max
有些聚合分析的算法郊楣,是很容易就可以并行的,比如說max
不易并行的算法:distinct
有些聚合分析的算法咕痛,是不好并行的痢甘,比如說,count(distinct)茉贡,并不是說塞栅,在每個node上,直接就出一些distinct value,就可以的放椰,因為數(shù)據(jù)可能會很多
es會采取近似聚合的方式作烟,就是采用在每個node上進行近估計的方式,得到最終的結論砾医,cuont(distcint)拿撩,100萬,1050萬/95萬 --> 5%左右的錯誤率
近似估計后的結果如蚜,不完全準確压恒,但是速度會很快,一般會達到完全精準的算法的性能的數(shù)十倍
2错邦、三角選擇原則
精準+實時+大數(shù)據(jù) --> 選擇2個
(1)精準+實時: 沒有大數(shù)據(jù)探赫,數(shù)據(jù)量很小,那么一般就是單擊跑撬呢,隨便你則么玩兒就可以
(2)精準+大數(shù)據(jù):hadoop伦吠,批處理,非實時魂拦,可以處理海量數(shù)據(jù)毛仪,保證精準,可能會跑幾個小時
(3)大數(shù)據(jù)+實時: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" ##對品牌字段去重真竖,統(tǒng)計每月銷售的品牌數(shù)量
}
}
}
}
}
}
3、cardinality算法之優(yōu)化內(nèi)存開銷以及HLL算法
cardinality厌小,5%的錯誤率恢共,性能在100ms左右
3.1、precision_threshold優(yōu)化準確率和內(nèi)存開銷
GET /tvs/_search
{
"size": 0,
"aggs": {
"distinct_brand": {
"cardinality": {
"field": "brand",
"precision_threshold": 100
}
}
}
}
cardinality算法璧亚,會占用precision_threshold * 8 byte 內(nèi)存消耗讨韭,100 * 8 = 800個字節(jié),占用內(nèi)存很小。
而且unique value如果的確在precision_threshold 的值以內(nèi)透硝,那么可以確保100%準確狰闪。
當precision_threshold=100時,數(shù)百萬的unique value濒生,錯誤率在5%以內(nèi)
precision_threshold埋泵,值設置的越大,占用內(nèi)存越大罪治,可以確保更多unique value的場景下丽声,100%的準確
3.2、HyperLogLog++ (HLL)算法性能優(yōu)化
cardinality底層算法:HLL算法觉义,HLL算法的性能
會對所有的uqniue value取hash值恒序,通過hash值近似去求distcint count,誤差
默認情況下谁撼,發(fā)送一個cardinality請求的時候,會動態(tài)地對所有的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百分比算法以及網(wǎng)站訪問時延統(tǒng)計
需求:比如有一個網(wǎng)站屠缭,記錄下了每次請求的訪問的耗時箍鼓,需要統(tǒng)計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%的請求款咖,數(shù)值的最大的值是多少,不是完全準確的
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
我們的網(wǎng)站的提供的訪問延時的SLA铐殃,確保所有的請求100%,都必須在200ms以內(nèi).
需求:在200ms以內(nèi)的跨新,有百分之多少富腊,在1000毫秒以內(nèi)的有百分之多少,
這個percentile ranks域帐,其實比pencentile還要常用
比如:按照品牌分組赘被,計算,電視機肖揣,售價在1000的占比民假,2000的占比,3000的占比
查詢實戰(zhàn)
GET /website/_search
{
"size": 0,
"aggs": {
"group_by_province": {
"terms": {
"field": "province"
},
"aggs": {
"latency_percentile_ranks": {
"percentile_ranks": {
"field": "latency",
"values": [
200,
1000
]
}
}
}
}
}
}