升级到 1.7.3 后 Elasticsearch 聚合损坏

Elasticsearch Aggregation Broken after upgrade to 1.7.3

它在升级到 1.7.3 之前工作正常,但现在它告诉我“对于 [Gender] 来说数据太大了”。我 运行

curl -XGET localhost:9200/_nodes/stats/indices/fielddata?fields=*

它产生了

{
    {"fielddata":{"memory_size_in_bytes":642066528,"evictions":0,
    "fields":{"Markers":{"memory_size_in_bytes":196538816},
     "RegistrationDate":{"memory_size_in_bytes":101759288},
     "Abbreviation":{"memory_size_in_bytes":185815224},
     "Gender":{"memory_size_in_bytes":52988320},
     "Birthdate":{"memory_size_in_bytes":104956384},
     "buildNum":{"memory_size_in_bytes":8496}
     }
}

性别只是一个字符,怎么会变大?

阅读https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html好像说明应该不会那么大。它只有 M、F、U 的值。有什么想法吗?

马克

nested:  UncheckedExecutionException[org.elasticsearch.common.breaker.CircuitBreakingException: [FIELDDATA] Data too large, data for [Gender] would be larger than limit of [633785548/604.4mb]];

您可能遇到了 CircuitBreakingException。这样做的主要原因是您的堆几乎已满,没有足够的可用内存来满足请求。这并不一定意味着 Gender 值占用了整个内存,只是 ES 无法使用可用内存的剩余部分加载 Gender 字段所需的所有字段数据。

默认情况下,如果没有为字段数据缓存设置特定限制并且默认情况下没有设置限制,则不会发生字段数据驱逐(提示 "evictions":0 在您的输出中)。因此,您应该尝试将 indices.fielddata.cache.size 设置为相对值(例如 10%)或绝对值(例如 3GB)。

您可以在 elasticsearch.yml 文件(在每个节点上)中设置它并重新启动您的节点,或者使用

动态地进行设置
curl -XPUT localhost:9200/_cluster/settings -d '{
    "persistent" : {
        "indices.fielddata.cache.size" : "20%"
    }
}'

请注意,设置太低的值会对您的集群产生负面影响,因为会有很多驱逐,并且必须经常重建字段数据缓存。因此,您可能需要进行一些试验,直到找到正确的值。