【发布时间】:2015-01-21 22:27:11
【问题描述】:
目前我们面临很多这样的例外:
ElasticsearchException[org.elasticsearch.common.breaker.CircuitBreakingException: Data too large, data for field [field1] would be larger than limit of [24108466176/22.4gb]]
经过对上述异常的一些调查,field1 似乎占用了很多fielddata cache size 以及另一个字段让我们称之为field2
GET /_stats/fielddata?fields=field1,field2的结果:
"total": {
"fielddata": {
"memory_size_in_bytes": 260456614595,
"evictions": 1226307,
"fields": {
"field1": {
"memory_size_in_bytes": 76629429704
},
"field2": {
"memory_size_in_bytes": 97600838429
}
}
}
}
注意:两个字段都是not_analyzed。 Field1 在搜索查询中被大量使用,而 field2 没有那么多。
因此,通过 es 文档的 doc value 部分,这些字段可以存储为 doc values 以减少堆使用。
这是解决上述异常等内存问题的好方法吗?
文档还说,通过将字段存储为 doc 值,索引会变大,有没有办法计算这种增加?
【问题讨论】:
-
在这种情况下建议使用 doc-values,因为您对堆施加的所有压力都将转移到磁盘上。不过,缺点是性能略有下降。而且由于您将堆的那部分从内存移动到磁盘,我猜想增加的堆使用量与减少的堆使用量相似。
标签: caching elasticsearch