FIELDDATA 数据太大
FIELDDATA Data is too large
我打开 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 的限制吗?
您可以尝试在 elasticsearch.yml
配置文件中将 fielddata circuit breaker 限制增加到 75%(默认为 60%)并重新启动集群:
indices.breaker.fielddata.limit: 75%
或者,如果您不想重新启动集群,您可以使用以下方法动态更改设置:
curl -XPUT localhost:9200/_cluster/settings -d '{
"persistent" : {
"indices.breaker.fielddata.limit" : "40%"
}
}'
试一试。
我也遇到了这个问题。
然后我检查字段数据内存。
使用以下请求:
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": {
}
}
}
},
你可以看到我的indexes name base datetime, evictions 都是0。另外,2016.04.02内存是53009116,但是2016.04.29也是0。
所以我可以得出结论,旧数据已占用所有内存,因此新数据无法使用它,然后当我进行 agg 查询新数据时,它会引发 CircuitBreakingException
可以设置config/elasticsearch.yml
indices.fielddata.cache.size: 20%
它使 es 可以在达到内存限制时逐出数据。
但可能才是真正的解决方案,你应该在 furture.and 中添加你的内存 监视字段数据内存使用是一个好习惯。
更多详情:https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html
我认为首先了解为什么会发生这种情况很重要。
在我的例子中,我遇到了这个错误,因为我在 "analyzed"
字段上进行了 运行 聚合。如果您确实需要将字符串字段设置为 analyzed
,您应该考虑使用多字段并将其设为 analyzed
进行搜索,not_analyzed
进行聚合。
前几天我 运行 进入了这个问题。除了检查字段数据内存外,我还会考虑检查 JVM 和 OS 内存。就我而言,管理员忘记修改 ES_HEAP_SIZE 并将其保留在 1gig。
CircuitBreakingException: [FIELDDATA] Data too large
错误的替代解决方案是清理 old/unused 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
只需使用:
ES_JAVA_OPTS="-Xms10g -Xmx10g" ./bin/elasticsearch
由于默认堆是1G,如果你的数据很大,你应该设置更大
我打开 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 的限制吗?
您可以尝试在 elasticsearch.yml
配置文件中将 fielddata circuit breaker 限制增加到 75%(默认为 60%)并重新启动集群:
indices.breaker.fielddata.limit: 75%
或者,如果您不想重新启动集群,您可以使用以下方法动态更改设置:
curl -XPUT localhost:9200/_cluster/settings -d '{
"persistent" : {
"indices.breaker.fielddata.limit" : "40%"
}
}'
试一试。
我也遇到了这个问题。 然后我检查字段数据内存。
使用以下请求:
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": {
}
}
}
},
你可以看到我的indexes name base datetime, evictions 都是0。另外,2016.04.02内存是53009116,但是2016.04.29也是0。
所以我可以得出结论,旧数据已占用所有内存,因此新数据无法使用它,然后当我进行 agg 查询新数据时,它会引发 CircuitBreakingException
可以设置config/elasticsearch.yml
indices.fielddata.cache.size: 20%
它使 es 可以在达到内存限制时逐出数据。
但可能才是真正的解决方案,你应该在 furture.and 中添加你的内存 监视字段数据内存使用是一个好习惯。
更多详情:https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html
我认为首先了解为什么会发生这种情况很重要。
在我的例子中,我遇到了这个错误,因为我在 "analyzed"
字段上进行了 运行 聚合。如果您确实需要将字符串字段设置为 analyzed
,您应该考虑使用多字段并将其设为 analyzed
进行搜索,not_analyzed
进行聚合。
前几天我 运行 进入了这个问题。除了检查字段数据内存外,我还会考虑检查 JVM 和 OS 内存。就我而言,管理员忘记修改 ES_HEAP_SIZE 并将其保留在 1gig。
CircuitBreakingException: [FIELDDATA] Data too large
错误的替代解决方案是清理 old/unused 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
只需使用:
ES_JAVA_OPTS="-Xms10g -Xmx10g" ./bin/elasticsearch
由于默认堆是1G,如果你的数据很大,你应该设置更大