首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用significant_terms聚合的ElasticSearch circuit_breaking_exception (数据太大)

使用significant_terms聚合的ElasticSearch circuit_breaking_exception (数据太大)
EN

Stack Overflow用户
提问于 2016-05-14 01:45:43
回答 3查看 32.3K关注 0票数 9

查询:

代码语言:javascript
复制
{
  "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
}

错误:

代码语言:javascript
复制
{
  "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。集群需要多少内存来执行这个查询?

EN

回答 3

Stack Overflow用户

发布于 2016-05-19 19:13:41

我不知道你想做什么,但我很好奇。因为您得到了该异常,所以我可以假设该字段的基数不小。我猜,你基本上是在尝试查看该领域中所有术语之间的关系,基于重要性。

第一次significant_terms聚合将考虑该字段中的所有术语,并确定它们的“重要性”程度(计算该术语在整个索引中的频率,然后将这些频率与range查询文档集中的频率进行比较)。

完成后(对于所有项),您需要第二个应该执行第一步的significant_aggregation,但是现在考虑每一项并为其执行另一个significant_aggregation。那会很痛苦的。基本上,您是在计算number_of_term * number_of_terms significant_terms计算。

最大的问题是,你想做什么,

如果您想要查看该领域中所有术语之间的关系,由于上面解释的原因,这将是昂贵的。我的建议是运行第一个significant_terms聚合,获取前10个术语,然后使用另一个significant_terms聚合运行第二个查询,但可能通过执行父terms聚合和include only those 10 from the first query来限制术语。

您还可以查看sampler aggregation,并将其用作only one重要术语聚合的父项。

此外,我不认为增加熔断限制是真正的解决方案。选择这些限制是有原因的。你可以增加它,也许它会起作用,但它必须让你问自己,这是不是你的用例的正确查询(因为它听起来不像是正确的)。它在异常中的极限值可能不是最终的值……reused_arrays引用了Elasticsearch中的一个可调整大小的数组类,因此如果需要更多元素,则数组大小会增加,您可能会再次触发断路器,以获得另一个值。

票数 9
EN

Stack Overflow用户

发布于 2016-05-18 16:49:34

您可以尝试在elasticsearch.yml配置文件中将request circuit breaker限制提高到41% (默认值为40%),然后重新启动群集:

代码语言:javascript
复制
indices.breaker.request.limit: 41%

或者,如果您不希望重新启动群集,可以使用以下命令动态更改设置:

代码语言:javascript
复制
curl -XPUT localhost:9200/_cluster/settings -d '{
  "persistent" : {
    "indices.breaker.request.limit" : "41%" 
  }
}'

根据显示的数字(即"bytes_limit": 6844055552, "bytes_wanted": 6844240272)判断,您刚刚丢失了大约190KB的堆,因此增加1%到41%,您应该为您的请求断路器获得17MB的额外堆(总堆=~ 17 MB ),这应该足够了。

只需确保不要将此值增加得太高,因为请求断路器还与fielddata断路器和其他组件共享堆,因此您将面临发生OOM的风险。

票数 7
EN

Stack Overflow用户

发布于 2016-05-18 19:36:09

断路器设计用于处理请求处理需要的内存超过可用内存的情况。您可以使用以下查询来设置限制

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37216300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档