2017-10-10 21 views
0

我正在使用内部使用elasticsearch的crate 1.0.2。所以我的问题适用于两者。对于某些查询,我得到断路异常。使用水平缩放可以避免电路突破异常吗?

CircuitBreakingException:[母体]数据太大时,用于数据[收集:0]将是比[11946544332/11.1gb]

这些查询限值大主要组由多个列。我拥有数十亿的索引文档,并将16 GB的RAM分配为箱堆大小。我有多个这样的节点在一个集群中连接在一起。在群集中添加更多节点是否有助于摆脱此错误并使我的相同查询正常运行?或者是我必须增加堆到30 GB?我担心的是,当我将其增加到30GB并且添加更多数据时,总有一天查询会再次触发断路器。所以我想通过水平缩放来解决它,即增加更多的节点。这是更明智的决定吗?

回答

1

简答:通常水平缩放有帮助。

您的错误似乎是由群组查询造成的。 GROUP BY操作以分布式方式执行。因此,更多节点 通常会分割负载,因此也会分配内存使用量。 (请确保 有足够的碎片,使他们的所有节点之间传播)

有一个陷阱,但:最终数据需要被你发送的初始查询到 节点上合并在一起。这通常很好,因为数据集 已达到预先汇总的数据集,但如果基数太高(例如 主键上的GROUP BY),则整个数据集必须放入此协调器节点的内存中。

如果你的节点有足够的内存上升到30GB(仍然有足够的空间用于文件系统缓存),我个人倾向于在添加新节点之前首先增加HEAP大小 。

更新: 最近的版本(2.1.X)还包含一些关于断路器行为的修复。所以如果可以更新的话也会推荐。

更新2:

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

+0

感谢您的回复。我正在考虑如何在我的情况下实现这一点。 – vinayakshukre