Jaming R 2019-04-03 18:17 采纳率: 0%
浏览 1269

Elasticsearch只入数据不查询时,会把什么数据放到内存呢

搞了一个单节点ES,入了4T的数据,机器48G内存,给ES24g内存在一次查询都没有的情况下,es堆内存占了80%,那么这些内存是什么数据占的呢

    "segments": {
    "count": 9425,
    "memory_in_bytes": 19661945748,

    "query_cache": {
    "memory_size_in_bytes": 0,
    "total_count": 0,

    "fielddata": {
    "memory_size_in_bytes": 0,
    "evictions": 0

    发现segmeng占了18G,那么为什么segment不刷到磁盘呢?
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 18:10
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在 Elasticsearch 中,当一个索引或分片被创建后,它会在内存中保留一定数量的行(row)作为“预热”(hot)行。这个值通常为索引大小的一半,即大约 2/3 的空间用于内存中的行。

    在你提到的例子中,如果你的索引有 4TB 的数据,那么它会占用大约 2.5 TB 的内存(因为索引大小的一半是 2TB)。然而,在没有执行任何查询的情况下,这 2.5 TB 的内存可能不会全部被使用。

    因此,即使你的机器只有 48GB 内存,也可能会有足够的空间来存储所有的预热行。但是,一旦开始进行查询,就会有大量数据从内存中转移到磁盘上以供查询和分析。

    具体来说,当你运行查询时,Elasticsearch 会将所有匹配到的文档从内存移动到磁盘,并且这些文档会被写入到对应的索引文件中。这样做的目的是为了提高查询性能,因为它可以减少内存的负担,同时也可以防止内存溢出。

    以下是一个简单的示例,展示了如何在 Elasticsearch 中使用 GET 查询:

    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestHighLevelClient;
    
    public class SearchExample {
    
        public static void main(String[] args) throws Exception {
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            SearchResponse response = client.prepareSearch("index")
                    .setTypes("type")
                    .setQuery(QueryBuilders.matchAllQuery())
                    .execute()
                    .actionGet();
    
            System.out.println(response);
            client.close();
        }
    }
    

    在这个例子中,我们首先创建了一个 RestHighLevelClient 对象,然后使用它调用 prepareSearch 方法来准备搜索请求。然后,我们设置了要搜索的索引、类型以及查询条件。最后,我们执行了查询并获取了响应。

    请注意,这只是一个基本的例子,实际的查询可能会更复杂,包括过滤、排序和其他聚合操作。

    评论

报告相同问题?