【问题标题】:Elasticsearch query with nested aggregations causing out of memory具有嵌套聚合的 Elasticsearch 查询导致内存不足
【发布时间】:2014-05-13 18:50:01
【问题描述】:

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

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 错误有点困惑。

我是否错误地使用了聚合?如果没有,我该怎么做才能解决这个问题? 谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    如果您要在很大程度上汇总一组非常小的数据,您应该look into using docvalues。然后,文档的值以一种便于查找文档 ID 的方式存储。它的开销要多一些,但这样一来,您就可以将其留给操作系统的字段缓存以将相关页面保存在内存中,而不必加载整个字段。

    【讨论】:

    • 谢谢亚历克斯!这看起来是正确的方法,感谢您提供的链接,它非常有帮助。听起来我需要确定将用于创建统计信息的特定字段,然后将它们标记为“格式”:“doc_values”。这需要一些计划,但我认为这让我朝着正确的方向前进。非常感谢!
    • 刚刚使用 doc_values 字段数据将上述字段(以及更多字段)转移到新索引中。运行上面的查询,它通过了!虽然花了大约 5 秒钟。等待 2 秒后,我确信事情正在爆炸,但事情就是这样。 ;)
    • 现在我有更多的数据,内存又用完了。同样的 java.lang.OutOfMemoryError: Java 堆空间错误。这是我的映射,我在这里做错了吗? pastebin.com/XBMivWGT
    【解决方案2】:

    当然不确定映射,但查看字段 DstCountry 的值可以是 non_analyzed。比您可以用聚合中的过滤器替换查询。也许这有帮助。

    还要检查您在聚合中使用的字段是否属于 non_analyzed 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2020-12-21
      • 2020-09-05
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多