apachespark-优化并行查询的Elasticsearch



在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都会很高兴地处理一个碎片,聚合结果的网络聊天会更少,而且"应该"更快。我一定会试试的。