????????一直以來(lái),es的agg聚合分析性能都比較差(對(duì)應(yīng)sql的 group by)。特別是在超多數(shù)據(jù)中做聚合,在搜索的條件命中特別多結(jié)果的情況下,聚合分析會(huì)非常非常的慢。? ? ? ? 一個(gè)聚合條件:聚合分析請(qǐng)求的時(shí)間 = search time + agg time? ? ? ? N個(gè)聚合條件:聚合分析請(qǐng)求的時(shí)間 = search time + agg time * N? ? ? ??? ? ? ? 搜索的數(shù)據(jù)范圍越大,聚合請(qǐng)求時(shí)間越長(zhǎng)。? ? ? ? 搜索條件命中的數(shù)據(jù)越多,聚合請(qǐng)求的時(shí)間越長(zhǎng)。? ? ? ? 搜索的字段,不一樣的值越多,聚合請(qǐng)求時(shí)間越長(zhǎng)。例如性別字段,通常僅有3個(gè)取值(男、女、未知),這種屬于取值少的。像郵箱字段,值非常多,上億個(gè)。這種就屬于高基數(shù)字段。同樣的搜索條件,高基數(shù)字段的聚合耗時(shí)會(huì)多非常多!? ? ? ? 聚合請(qǐng)求時(shí)候非常吃cpu 和io資源的。通常在大數(shù)據(jù)檢索場(chǎng)景下,很難支持高并發(fā)的聚合。并發(fā)上去以后,先是CPU飆升,再是IO飆升,隨之load很高很高。其根本原因,從agg聚合的源碼來(lái)看。因?yàn)榫酆险?qǐng)求分為兩個(gè)階段,先根據(jù)條件查詢(xún)數(shù)據(jù)。然后將命中的全部數(shù)據(jù),放在內(nèi)存中做計(jì)算。在第二個(gè)過(guò)程中,因?yàn)閷⑺忻械臄?shù)據(jù)全部取回來(lái),然后做計(jì)算,就涉及到了非常多的小文件的IO。IO會(huì)蹭蹭蹭的飆升。? ? ? ? 就目前而言,在不改源碼的情況下,聚合性能很難有很大的突破。本篇文章,通過(guò)抽樣的思路,通過(guò)抽取分片,相當(dāng)于數(shù)據(jù)剪枝的方式,來(lái)節(jié)省資源消耗。提升聚合分析性能,提升大概在3-5倍。隨著數(shù)據(jù)越多,分片越多,資源越少,性能提升效果越明顯。
????????我個(gè)人是做萬(wàn)億級(jí)內(nèi)容數(shù)據(jù)檢索的。負(fù)責(zé)搜索集群,負(fù)責(zé)搜索優(yōu)化。聚合分析性能優(yōu)化,我應(yīng)該說(shuō)已經(jīng)看了全網(wǎng)關(guān)于優(yōu)化的文章。在實(shí)際數(shù)據(jù)體量非常大的前提下,實(shí)際效果不是太明顯。????????其中比較好的有這幾篇文章。es官方博文Improving the performance of high-cardinality terms aggregations in Elasticsearch | Elastic BlogElasticsearch 聚合性能優(yōu)化六大猛招-騰訊云開(kāi)發(fā)者社區(qū)-騰訊云Elasticsearch聚合優(yōu)化 | 聚合速度提升5倍_es聚合速度-CSDN博客
抽樣聚合方案
1.es原生抽樣聚合
官方提供的采樣聚合
參考文檔:Sampler?aggregation?|?Elasticsearch?Guide?[7.11]?|?Elastic
????????ES中的抽樣聚合,意思是只對(duì)高質(zhì)量的數(shù)據(jù)做聚合。比如,指定搜索條件,該搜索條件命中的數(shù)據(jù)為100W,對(duì)這100W數(shù)據(jù),根據(jù)相關(guān)性分?jǐn)?shù)排序。然后對(duì)這topK的數(shù)據(jù)做聚,比如每個(gè)shard上取200條評(píng)分最高的數(shù)據(jù),去聚合。這就是ES?sampler?aggregation的含義。
2.es?pre-filter機(jī)制
參考文檔:Elasticsearch的search之_shards?skipped之謎_布道的博客-CSDN博客__shards?skipped
3.es在檢索過(guò)程中指定分片
GET index_name/_search?preference=_shards:0
? ? ? ? 抽樣抽分片的思路,只每次固定只檢測(cè)其中一個(gè)分片。例如我們的索引一共300G,每個(gè)分片30G,一共有10個(gè)分片。在檢索的過(guò)程中,只對(duì)其中一個(gè)分片做檢索和聚合。其最終的聚合結(jié)果,根據(jù)我們的測(cè)試來(lái)看,效果還是非常不錯(cuò)的。聚合結(jié)果的分布情況和本來(lái)的terms聚合相差不大。性能也能提升個(gè)幾倍。注意這種方式,聚合結(jié)果是近似的,并不是完全準(zhǔn)確的(ES本身的聚合解結(jié)果就不是100%精準(zhǔn)的)。
? ? ? ? 在大數(shù)據(jù)隨機(jī)分布的情況下。在搜索命中大量數(shù)據(jù)情況下,其結(jié)果分布也是滿(mǎn)足正態(tài)分布的。注意在搜索結(jié)果命中的結(jié)果集越多,其結(jié)果越符合正態(tài)分布,其聚合結(jié)果越接近標(biāo)準(zhǔn)值(原生terms聚合)。這里有一個(gè)值,一個(gè)經(jīng)驗(yàn)值,在搜索提交條件命中大于10000的時(shí)候,可以用抽樣,結(jié)果偏差不大。
? ? ? ? 注意,這里具體抽哪一個(gè)分片是有說(shuō)法的。我們要考慮一個(gè)問(wèn)題,同一個(gè)搜索條件,聚合結(jié)果應(yīng)該是一致的。這里可以將搜索條件進(jìn)行md5,然后取hash值,然后將hash值模上分片總數(shù)。這里只是一個(gè)思路。
ES官方的抽樣聚合說(shuō)明
抽樣方案對(duì)比測(cè)試
對(duì)比測(cè)試了三種聚合分析的方式,其中包含了terms、sampler?terms、和shard抽樣(假如有10個(gè)shard,只對(duì)其中一個(gè)shard做搜索)
先說(shuō)測(cè)試結(jié)論
官方的抽樣,召回的結(jié)果和標(biāo)準(zhǔn)結(jié)果偏差較大。
官方的抽樣,時(shí)間花費(fèi)上,并沒(méi)有太大的提升。
抽取分片,召回的結(jié)果和標(biāo)準(zhǔn)結(jié)果偏差不大。
抽取分片,時(shí)間花費(fèi)上,性能提升3-5倍。資源花費(fèi)為分片總數(shù)分之一。
響應(yīng)時(shí)間對(duì)比如下
檢索范圍 |
檢索條件 |
查詢(xún)語(yǔ)法 |
響應(yīng)時(shí)間 |
備注 |
major_index_202303 |
(北京?AND?暴雨) |
terms |
4561 7694 |
|
shard抽樣 |
1423 2785 |
效果最好 |
||
terms?sampler |
5650 3663 |
效果沒(méi)有太明顯 |
召回結(jié)果對(duì)比如下
關(guān)鍵詞 |
terms(結(jié)果) |
抽取一個(gè)分片 |
sampler?terms(抽樣200) |
備注 |
地區(qū) |
4224 |
446 |
2094 |
|
中國(guó) |
3772 |
375 |
- |
|
發(fā)展 |
3605 |
342 |
- |
|
天氣 |
3503 |
378 |
1942 |
|
部分 |
2781 |
294 |
1525 |
|
大雨 |
2395 |
236 |
- |
|
暴雨 |
2394 |
264 |
2454 |
|
氣溫 |
2079 |
212 |
915 |
|
局地 |
1851 |
199 |
1055 |
|
工作 |
1741 |
187 |
- |
|
降雨 |
- |
- |
1111 |
|
北京 |
- |
- |
827 |
|
巴西 |
- |
- |
801 |
|
災(zāi)害 |
- |
- |
801 |
檢索語(yǔ)句
?這里使用的是query_string 檢索語(yǔ)法。對(duì)比標(biāo)準(zhǔn)的terms聚合,官方的simple抽樣,和抽分片。
"query": {
"query_string": {
"query": """北京?AND?暴雨""",
"fields": [
"content^1.0",
"title^1.0"
],
"type": "phrase",
"tie_breaker": 1,
"default_operator": "and",
"max_determinized_states": 10000,
"enable_position_increments": true,
"fuzziness": "AUTO",
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"phrase_slop": 0,
"escape": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1
}
}
全部測(cè)試結(jié)果原始數(shù)據(jù)
搜索范圍 |
搜索條件 |
聚合方式 |
耗時(shí)情況ms |
返回結(jié)果? |
major_info_202303 |
(北京?AND?暴雨) |
terms |
4561 7694 |
[ ????????{ ??????????"key"?:?"地區(qū)", ??????????"doc_count"?:?4224 ????????}, ????????{ ??????????"key"?:?"中國(guó)", ??????????"doc_count"?:?3772 ????????}, ????????{ ??????????"key"?:?"發(fā)展", ??????????"doc_count"?:?3605 ????????}, ????????{ ??????????"key"?:?"天氣", ??????????"doc_count"?:?3503 ????????}, ????????{ ??????????"key"?:?"部分", ??????????"doc_count"?:?2781 ????????}, ????????{ ??????????"key"?:?"大雨", ??????????"doc_count"?:?2395 ????????}, ????????{ ??????????"key"?:?"暴雨", ??????????"doc_count"?:?2394 ????????}, ????????{ ??????????"key"?:?"氣溫", ??????????"doc_count"?:?2079 ????????}, ????????{ ??????????"key"?:?"局地", ??????????"doc_count"?:?1851 ????????}, ????????{ ??????????"key"?:?"工作", ??????????"doc_count"?:?1741 ????????}文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-762692.html ??????]文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762692.html |
terms sampler |
5650 3663 |
[ ??????????{ ????????????"key"?:?"暴雨", ????????????"doc_count"?:?2454 ??????????}, ??????????{ ????????????"key"?:?"地區(qū)", ????????????"doc_count"?:?2094 ??????????}, ??????????{ ????????????"key"?:?"天氣", ????????????"doc_count"?:?1942 ??????????}, ??????????{ ????????????"key"?:?"部分", ????????????"doc_count"?:?1525 ??????????}, ??????????{ ????????????"key"?:?"降雨", ????????????"doc_count"?:?1111 ??????????}, ??????????{ ????????????"key"?:?"局地", ????????????"doc_count"?:?1055 ??????????}, ??????????{ ????????????"key"?:?"氣溫", ????????????"doc_count"?:?915 ??????????}, ??????????{ ????????????"key"?:?"北京", ????????????"doc_count"?:?827 ??????????}, ??????????{ ????????????"key"?:?"巴西", ????????????"doc_count"?:?801 ??????????}, ??????????{ ????????????"key"?:?"災(zāi)害", ????????????"doc_count"?:?801 ??????????} ????????] |
||
terms + 指定shard |
1423 2785 |
[ ????????{ ??????????"key"?:?"地區(qū)", ??????????"doc_count"?:?446 ????????}, ????????{ ??????????"key"?:?"天氣", ??????????"doc_count"?:?378 ????????}, ????????{ ??????????"key"?:?"中國(guó)", ??????????"doc_count"?:?375 ????????}, ????????{ ??????????"key"?:?"發(fā)展", ??????????"doc_count"?:?342 ????????}, ????????{ ??????????"key"?:?"部分", ??????????"doc_count"?:?294 ????????}, ????????{ ??????????"key"?:?"暴雨", ??????????"doc_count"?:?264 ????????}, ????????{ ??????????"key"?:?"大雨", ??????????"doc_count"?:?236 ????????}, ????????{ ??????????"key"?:?"氣溫", ??????????"doc_count"?:?212 ????????}, ????????{ ??????????"key"?:?"局地", ??????????"doc_count"?:?199 ????????}, ????????{ ??????????"key"?:?"工作", ??????????"doc_count"?:?187 ????????} ??????] |
到了這里,關(guān)于ES通過(guò)抽樣agg聚合性能提升3-5倍的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!