如何在Java中处理来自弹性搜索的大量数据?

时间:2019-12-12 23:06:37

标签: java elasticsearch parallel-processing lucene large-data

我的弹性索引中有大量数据(例如每个索引25GB的数据,每个索引都是每天创建的,即每天创建一个索引),并且我可以拥有1(最小)到60(最大)的数据这样的索引,我需要基于所有给定索引中的几个键进行聚合。

  

我的ElasticSearch是一个运行ElasticSearch 6.x的4节点集群设置

我正在使用Java线程对每个索引运行复合聚合查询,该查询分页并获取每个索引的聚合结果,这为我提供了为聚合选择的键及其计数的所有唯一组合[请参见下面的示例]。

我将每天的结果存储到 date add new 0 2019-12-21 30 days 2019-12-21 1 2019-11-13 90 days 2020-02-11 中,并将每天的列表数据合并到一个巨大的List<Map<String, Object>>中,它将包含来自所有索引的所有数据,然后使用{ {1}}对来自此列表的重复项进行分组,并对计数求和。

这里的问题是,由于唯一的组合非常庞大(每个索引的顺序为数百万个,并且该组合也会在其他索引中重复),所以我用完了Java内存,存储每个索引的结果并进行分组。

如何用有限的资源解决此问题,而不用尽内存? Lucene的Indexing可以在这里帮助存储中间结果并避免堆内存不足吗?或者redis可以在这里帮助存储中间结果并避免堆内存不足吗?

请帮助我解决这个问题。

  

如果我一次在所有索引上运行一个查询,则由于CPU使用率高,每个索引都需要一个单独的查询

索引内的样本数据

List

综合汇总查询

Collections.groupingBy(...)

结果

[
    {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3",
        ...[MAX 40 Key-Value Paris]
    },
    {
        "key1": "value4",
        "key2": "value5",
        "key3": "value6",
        ...[MAX 40 Key-Value Paris]
    },
    ....
]

0 个答案:

没有答案