我打开kibana并进行搜索,我得到了分片失败的错误。我查看了elasticsearch.log文件,我看到了这个错误:
org.elasticsearch.common.breaker.CircuitBreakingException: [FIELDDATA] Data too large, data for [@timestamp] would be larger than limit of [622775500/593.9mb]
有没有办法增加593.9mb的限制?
您可以尝试在fielddata circuit breaker配置文件中将elasticsearch.yml
限制增加到75%(默认值为60%)并重新启动集群:
indices.breaker.fielddata.limit: 75%
或者,如果您不想重新启动群集,可以使用以下命令动态更改设置:
curl -XPUT localhost:9200/_cluster/settings -d '{
"persistent" : {
"indices.breaker.fielddata.limit" : "40%"
}
}'
试试看。
我也遇到了这个问题。然后我检查fielddata内存。
使用以下请求:
GET /_stats/fielddata?fields=*
输出显示:
"logstash-2016.04.02": {
"primaries": {
"fielddata": {
"memory_size_in_bytes": 53009116,
"evictions": 0,
"fields": {
}
}
},
"total": {
"fielddata": {
"memory_size_in_bytes": 53009116,
"evictions": 0,
"fields": {
}
}
}
},
"logstash-2016.04.29": {
"primaries": {
"fielddata": {
"memory_size_in_bytes":0,
"evictions": 0,
"fields": {
}
}
},
"total": {
"fielddata": {
"memory_size_in_bytes":0,
"evictions": 0,
"fields": {
}
}
}
},
你可以看到我的索引名称基本日期时间,并且驱逐都是0.另外,2016.04.02内存是53009116,但2016.04.29也是0。
所以我可以得出结论,旧数据占用了所有内存,所以新数据无法使用它,然后当我使用agg查询新数据时,它会引发CircuitBreakingException
你可以设置config / elasticsearch.yml
indices.fielddata.cache.size: 20%
它使es可以在达到内存限制时逐出数据。
但是可能是你应该在将来添加内存的真正解决方案。并且监视fielddata内存使用是好习惯。
更多细节:https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html
CircuitBreakingException: [FIELDDATA] Data too large
错误的替代解决方案是清除旧的/未使用的FIELDDATA缓存。
我发现fielddata.limit
已经在索引之间共享,因此删除未使用的indice / field的缓存可以解决问题。
curl -X POST "localhost:9200/MY_INDICE/_cache/clear?fields=foo,bar"
有关更多信息https://www.elastic.co/guide/en/elasticsearch/reference/7.x/indices-clearcache.html
我认为重要的是要了解为什么会发生这种情况。
在我的情况下,我有这个错误,因为我在"analyzed"
字段上运行聚合。如果你真的需要你的字符串字段是analyzed
,你应该考虑使用多字段并使analyzed
用于搜索,not_analyzed
用于聚合。
前几天我遇到了这个问题。除了检查fielddata内存之外,我还考虑检查JVM和OS内存。在我的情况下,管理员忘记修改ES_HEAP_SIZE并将其保留在1gig。
只需使用:
ES_JAVA_OPTS="-Xms10g -Xmx10g" ./bin/elasticsearch
由于默认堆是1G,如果您的数据很大,则应将其设置得更大