一尘不染

带有嵌套聚合的Elasticsearch查询导致内存不足

elasticsearch

我安装了16gb内存的Elasticsearch。我开始使用聚合,但是在尝试发出以下查询时遇到“
java.lang.OutOfMemoryError:Java堆空间”错误:

POST /test-index-syslog3/type-syslog/_search
{
    "query": {
        "query_string": {
           "default_field": "DstCountry",
           "query": "CN"
        }
    },
    "aggs": {
        "whatever": {
            "terms": {
                "field" : "SrcIP"
            },
            "aggs": {
                "destination_ip": {
                    "terms": {
                        "field" : "DstIP"
                    },
                    "aggs": {
                        "port" : {
                            "terms": {
                                "field" : "DstPort"
                            }
                        }
                    }
                }
            }
        }
    }
}

query_string本身仅返回1266次匹配,因此OOM错误让我有些困惑。

我是否正确使用了聚合?如果没有,我该怎么做才能解决此问题?谢谢!


阅读 470

收藏
2020-06-22

共1个答案

一尘不染

您正在将整个SrcIP-,DstIP-和-
DstPort字段加载到内存中以进行汇总。这是因为Elasticsearch不会反转整个字段,以便能够快速查找给定ID的字段的文档值。

如果您要在很小的一组数据上进行汇总,则应考虑使用docvalues。然后,以一种易于存储的方式存储文档的值(在给定文档ID的情况下)。它有更多的开销,但是那样一来,您就可以将其留在操作系统的字段缓存中以在内存中存储相关的页面,而不必加载整个字段。

2020-06-22