在运行于AWS EMR的20个节点的Elasticsearch集群上,我的索引约为3gb。该索引有5个分片,并被复制4次。基础数据是书籍,但根据格式,我将它们分为段落或行块,因此大约有2700万份文档。编制索引仅需约5分钟。

我要在索引中搜索大约1500万个短语。

搜索逻辑是一个4层瀑布,一旦找到结果,它就会停止:精确匹配=>编辑距离为1的模糊匹配=>编辑距离为2的模糊匹配=>部分短语匹配。我以这种方式将其分解,因此可以通过某种质量度量来过滤比赛。

为了分发和执行搜索,我使用了Spark。

我发现我可以使搜索运行最快的是每秒420个短语,这意味着整个任务将需要10到12个小时。

我的问题是:是合理的搜索率吗?

如果将整个索引放在一个分片上并在每个节点上复制完整索引,我会得到更好的性能吗?还是我应该朝另一个方向增加分片级别?我怀疑这两个问题的答案将是“同时尝试!” ,从长远来看,我很可能会这样做,但是我有一个短期的截止日期,我想对其进行优化,因此我想看看是否还有其他人遇到过类似问题。

我很乐意根据需要提供更多详细信息。

抱歉,如果这不是主题,我找不到关于Elasticsearch这种用例的大量文档。

最佳答案

在20个节点上仅保留 3gb数据就浪费了资源。如果索引为5分片,则仅从5个节点开始。哎呀,3gb太小了,您甚至可以使该索引仅包含一个碎片并在单个节点上运行。

您很幸运,只需5分钟即可对所有数据建立索引,因为您会很快找到合适的集群大小来最佳地运行查询。从一个节点上的一个主碎片(无副本)开始,然后添加一个副本和另一个节点,依此类推

然后从两个主分片和两个节点开始,添加副本和节点,等等。

对于每个测试,请测量其运行的速度,并在某个时间点(即在一两天内)会找到最适合您搜索需求的确切簇大小。

更新

如果每个节点有32个CPU,则可以有一个节点和20个分片。在每次搜索过程中,每个CPU都会很乐意处理一个碎片,将汇总结果的网络闲聊减少,并且“应该”更快。我一定会尝试的。

10-04 12:39