Elasticsearch 聚合數(shù)據(jù)結(jié)果不精確
背景
近期我們項(xiàng)目中出現(xiàn)使用ES聚合某個(gè)索引的數(shù)據(jù)取TOP 10的數(shù)據(jù)和相同條件下查詢所有數(shù)據(jù)然后按數(shù)據(jù)量排序取的TOP 10的數(shù)據(jù)不一致的問(wèn)題。
下面我們簡(jiǎn)單分析一下這個(gè)問(wèn)題,列出一些常見(jiàn)的解決方案。
問(wèn)題
Elasticsearch分片機(jī)制
Elasticsearch索引(index)有一個(gè)主分片(primary shard)和0個(gè)或者多個(gè)分片副本組成。
Elasticsearch檢索/聚合數(shù)據(jù)
query then fetch
query階段:
- 客戶端將請(qǐng)求發(fā)到協(xié)調(diào)節(jié)點(diǎn)(coordinate node);
- 協(xié)調(diào)節(jié)點(diǎn)將搜索請(qǐng)求廣播到所有的primary shard 或者 replica。
- 每個(gè)shard在本地執(zhí)行搜索并構(gòu)建一個(gè)匹配文檔大小為from + size的優(yōu)先隊(duì)列,每個(gè)分片返回各自優(yōu)先隊(duì)列中所有的docId和打分值個(gè)協(xié)調(diào)節(jié)點(diǎn)。
- 協(xié)調(diào)節(jié)點(diǎn)對(duì)各個(gè)分片分片返回的數(shù)據(jù)進(jìn)行合并,排序,分頁(yè)等操作,產(chǎn)出最終的結(jié)果集。
fetch階段:
- 協(xié)調(diào)節(jié)點(diǎn)根據(jù)Query階段產(chǎn)生的結(jié)果,去各個(gè)節(jié)點(diǎn)上查詢docId實(shí)際的文檔內(nèi)容,最終有協(xié)調(diào)節(jié)點(diǎn)返回結(jié)果給客戶端。
- coordinate node 對(duì) doc id 進(jìn)行哈希路由,將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的 node,此時(shí)會(huì)使用 round-robin 隨機(jī)輪詢算法,在 primary shard 以及其所有 replica 中隨機(jī)選擇一個(gè),讓讀請(qǐng)求負(fù)載均衡。
- 接收請(qǐng)求的 node 返回 document 給 coordinate node 。
- coordinate node 返回 document 給客戶端。
參考
https://www.elastic.co/cn/blog/understanding-query-then-fetch-vs-dfs-query-then-fetch
https://blog.csdn.net/a745233700/article/details/115585342?spm=1001.2014.3001.5506
問(wèn)題分析
期望結(jié)果:
c = 40, a = 40 , d = 35
實(shí)際結(jié)果:
d = 35, c = 35, a = 30
導(dǎo)致聚合不精確的原因分析:
- 效率因素:每個(gè)分片的取值Top X,并不是匯總?cè)康?TOP X。
- 性能因素:ES 可以不每個(gè)分片Top X,而是全量聚合,但勢(shì)必這會(huì)有很大的性能問(wèn)題。
解決方案
提高聚合的精確度
size:是聚合結(jié)果的返回值,客戶期望返回聚合排名10,size值就是 10。
shard_size: 每個(gè)分片上聚合的數(shù)據(jù)條數(shù)。shard_size 原則上要大于等于 size(若設(shè)置小于size,實(shí)則沒(méi)有意義,elasticsearch 會(huì)默認(rèn)置為size)
請(qǐng)求的size值越高,結(jié)果將越準(zhǔn)確,但計(jì)算最終結(jié)果的成本也將越高。
方案
- 調(diào)大 shard_size的值
官方推薦: size * 1.5 + 10
使用場(chǎng)景:數(shù)據(jù)量大、分片數(shù)多的集群業(yè)務(wù)場(chǎng)景
shard_size 值越大,結(jié)果越趨近于精準(zhǔn)聚合結(jié)果值。
此外,還可以通過(guò)show_term_doc_count_error參數(shù)顯示最差情況下的錯(cuò)誤值,用于輔助確定 shard_size 大小。
- 全量聚合(不推薦)
將size設(shè)置為分片支持的最大值來(lái)解決聚合的精度問(wèn)題。
缺點(diǎn):當(dāng)分片的數(shù)據(jù)量極大,會(huì)消耗巨大的cpu用于對(duì)數(shù)據(jù)的計(jì)算排序,對(duì)性能有較大影響。
其他OLAP數(shù)據(jù)庫(kù)
ClickHouse:對(duì)于追加類型的數(shù)據(jù),如:日志數(shù)據(jù),用戶行為數(shù)據(jù)查詢 聚合非???br> StarRocks:支持明細(xì),聚合,更新,主鍵模型。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-672246.html
參考:https://blog.csdn.net/laoyang360/article/details/107133008?ops_request_misc=&request_id=6783e0d839e34d91ac465bedac26b860&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2blogkoosearch~default-1-107133008-null-null.268v1control&utm_term=%E8%81%9A%E5%90%88%E4%B8%8D%E5%87%86&spm=1018.2226.3001.4450文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-672246.html
到了這里,關(guān)于Elasticsearch 聚合數(shù)據(jù)結(jié)果不精確問(wèn)題解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!