[英]"[circuit_breaking_exception] [parent]" Data too large, data for "[<http_request>]" would be error
[英]ElasticSearch circuit_breaking_exception (Data too large) with significant_terms aggregation
查詢:
{
"aggregations": {
"sigTerms": {
"significant_terms": {
"field": "translatedTitle"
},
"aggs": {
"assocs": {
"significant_terms": {
"field": "translatedTitle"
}
}
}
}
},
"size": 0,
"from": 0,
"query": {
"range": {
"timestamp": {
"lt": "now+1d/d",
"gte": "now/d"
}
}
},
"track_scores": false
}
錯誤:
{
"bytes_limit": 6844055552,
"bytes_wanted": 6844240272,
"reason": "[request] Data too large, data for [<reused_arrays>] would be larger than limit of [6844055552/6.3gb]",
"type": "circuit_breaking_exception"
}
索引大小為5G。 群集執行此查詢需要多少內存?
我不確定你要做什么,但我很想知道。 由於你得到了這個例外,我可以假設該字段的基數不小。 基本上,基於重要性,你基本上試圖看到該領域中所有術語之間的關系。
第一個significant_terms
聚合將考慮該字段中的所有項,並確定它們的“重要性”(在整個索引中計算該項的頻率,然后將其與來自range
查詢文檔集的頻率進行比較)。
在它完成之后(對於所有條款),你想要第二個有significant_aggregation
,應該做第一步,但現在考慮每個術語並為它做另一個significant_aggregation
。 那會很痛苦。 基本上,您正在計算number_of_term * number_of_terms
significant_terms計算。
最大的問題是你想做什么?
如果你想看到該字段中所有術語之間的關系,由於上述原因,這將是昂貴的。 我的建議是運行第一個significant_terms
聚合,前10個術語左右,然后用另一個significant_terms
聚合運行第二個查詢,但可能通過執行父terms
聚合來限制術語,並且僅包括第一個查詢中的那些10 。
您還可以查看采樣器聚合,並將其用作您唯一一個重要術語聚合的父級。
此外,我認為增加斷路器限制並不是真正的解決方案。 選擇這些限制是有原因的。 你可以增加它,也許它會起作用,但它必須讓你問自己這是否是你的用例的正確查詢 (因為它聽起來不像)。 它在異常中的限制值可能不是最后一個... reused_arrays
引用Elasticsearch中reused_arrays
大小的數組類,因此如果需要更多元素,則數組大小會增加,您可能會再次遇到斷路器,為了另一個價值。
斷路器旨在處理請求處理需要比可用內存更多的情況。 您可以使用以下查詢設置限制
PUT /_cluster/settings
{
"persistent" : {
"indices.breaker.request.limit" : "45%"
}
}
您可以獲得更多信息
https://www.elastic.co/guide/en/elasticsearch/reference/current/circuit-breaker.html https://www.elastic.co/guide/en/elasticsearch/reference/1.4/index-modules-fielddata html的
您可以嘗試在elasticsearch.yml
配置文件中將請求斷路器限制增加到41%(默認值為40%)並重新啟動群集:
indices.breaker.request.limit: 41%
或者,如果您不想重新啟動群集,可以使用以下命令動態更改設置:
curl -XPUT localhost:9200/_cluster/settings -d '{
"persistent" : {
"indices.breaker.request.limit" : "41%"
}
}'
根據顯示的數字判斷(即"bytes_limit": 6844055552, "bytes_wanted": 6844240272
),你只缺少~190 KB的堆,所以增加1%到41%你應該得到17 MB的額外堆(你的你的請求破壞者的總堆= ~17GB)應該足夠了。
只是確保不要將此值增加得太高,因為您遇到了OOM的風險,因為請求斷路器還與fielddata斷路器和其他組件共享堆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.