0

我正在使用内部使用 elasticsearch 的 crate 1.0.2。所以我的问题适用于两者。对于某些查询,我会遇到断路异常。

CircuitBreakingException:[父] 数据太大,[收集:0] 的数据将大于 [11946544332/11.1gb] 的限制

这些查询主要在多个列上分组。我有数十亿个文档被索引,并分配了 16 GB 的 RAM 作为 crate 堆大小。我有多个这样的节点在一个集群中连接在一起。在集群中添加更多节点是否有助于消除此错误,并且我的相同查询是否可以正常运行?还是我必须将堆增加到 30 GB?我担心的是当我将它增加到 30GB 并且随着我添加更多数据时,有一天该查询将再次击中断路器。所以我想通过水平缩放来解决它,即添加更多节点。那会是更明智的决定吗?

4

1 回答 1

1

简短回答:通常水平缩放会有所帮助。

您的错误似乎是由 group by 查询引起的。GROUP BY 操作以分布式方式执行。所以更多的节点通常会分担负载,因此也会分担内存使用量。(确保有足够的分片,以便它们分布在所有节点之间)

但是有一个问题:最终数据需要在您将初始查询发送到的节点上合并在一起。这通常很好,因为数据是预先聚合的,但是如果基数太高(例如,主键上的 GROUP BY),整个数据集必须适合此协调节点上的内存。

如果您的节点有足够的内存可以达到 30 GB(还有足够的空间用于文件系统缓存),我个人倾向于在添加新节点之前先增加 HEAP 大小。

更新:最新版本 (2.1.X) 还包含一些关于断路器行为的修复。因此,如果可以更新,也建议这样做。

更新2:

请注意,在不同的情况下断路器可能会跳闸。在您的情况下,这是由 GROUP BY 占用大量内存引起的。但是如果单个请求太大,它也可能会被绊倒。例如,如果批量大小太大。在这种情况下,更多的节点将无济于事。您必须减小批量大小。

于 2017-10-11T08:23:05.770 回答