簡體   English   中英

ElasticSearch circuit_breaking_exception(數據太大),帶有significant_terms聚合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM