当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch的MasterService计算集群状态花费的时间太长,并引发ProcessClusterEventTimeoutException

洪伟兆
2023-03-14

我们有一个应用程序,每秒向 ES 集群添加数千个文档。每次滚动更新要写入的索引并开始写入新索引时,都会收到以下错误,这些错误不允许在大约 1 分钟内引入文档。在那 1 分钟之后,一切都恢复正常,直到我们再次滚动索引。

[WARN ][o.e.c.s.MasterService    ] [NODE_NAME_1] took [28.3s], which is over [10s], to compute cluster state update for [put-mapping[_doc, _doc, ...
[DEBUG][o.e.a.a.i.m.p.TransportPutMappingAction] [NODE_NAME_1] failed to put mappings on indices [[[INDEX_1/SOME_ID]]], type [_doc]
org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException: failed to process cluster event (put-mapping) within 30s
    at org.elasticsearch.cluster.service.MasterService$Batcher.lambda$onTimeout$0(MasterService.java:143) [elasticsearch-7.5.2.jar:7.5.2]
    at java.util.ArrayList.forEach(ArrayList.java:1507) [?:?]
    at org.elasticsearch.cluster.service.MasterService$Batcher.lambda$onTimeout$1(MasterService.java:142) [elasticsearch-7.5.2.jar:7.5.2]
    at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:703) [elasticsearch-7.5.2.jar:7.5.2]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
    at java.lang.Thread.run(Thread.java:830) [?:?]

在第一行中,我在末尾加了省略号,因为它实际上相当大,这里是我们看到的图像(如图所示,行突然结束):

你知道这些错误消息是关于什么的吗?

我们是否可能因为集群状态太大而看到这些消息?这是否意味着我们有太多的分片或节点?

谢了。

注:

  • 我们使用ElasticSearch 7.5.2
  • 我们不使用ILM,当我说“滚动我们的索引”时,我们要做的是开始写入我们几个小时前创建但没有使用的新索引。然后我们停止写入旧索引。

共有1个答案

柯鸿云
2023-03-14

当ES无法应对大集群状态时,会出现此错误,并且更新集群状态的默认超时为10秒,但如您的错误消息中所述,它花了大约30秒。

集群状态在主节点上计算,然后通过MasterService发布Diff(节点存在)或整个集群状态(如果新节点加入集群)。Elasticsearch的java类。

您有大量的分片信息,这些信息以集群状态维护,您的主节点无法在默认的 10 秒内计算状态。

下面是来自Elasticsearch类org.elasticsearch.cluster.service.ClusterApplierService的代码,它尝试更新集群状态并引发此异常。

try {
    UpdateTask updateTask = new UpdateTask(config.priority(), source, new SafeClusterApplyListener(listener, logger), executor);
    if (config.timeout() != null) {
        threadPoolExecutor.execute(updateTask, config.timeout(),
            () -> threadPool.generic().execute(
                () -> listener.onFailure(source, new ProcessClusterEventTimeoutException(config.timeout(), source))));
    } else {
        threadPoolExecutor.execute(updateTask);
    }
}

您可以检查异常类<code>org.elasticsearch.cluster.metadata。ProcessClusterEventTimeoutException代码如下

public ProcessClusterEventTimeoutException(TimeValue timeValue, String source) {
        super("failed to process cluster event (" + source + ") within " + timeValue);
    }

您可以查看上面的代码,这将帮助您更好地理解问题。

解决问题的一些建议:

    < li >增加主节点的堆大小和CPU,以便可以像您的情况一样快速计算群集状态,即使计算的第一步也需要30秒。这意味着您的主节点没有足够的基础设施来快速计算。 < li >删除不必要的索引,这将减少碎片和簇状态的数量。 < li >以下是发布群集状态的设置,这是第二步,如果您发现发布需要很长时间,那么您可以在确定的情况下进行发布。如果数据节点在此期间变得不可用。
cluster.publish.info_timeout = 10s default(maybe this can work)
cluster.publish.timeout = 30s by default
 类似资料:
  • 问题内容: SQL: 用户索引: 个人资料索引 解释 : 上面的查询大约需要0.1221 我怎样才能使其运行更快? 问题答案: 我删除了此查询,因此搜索完成后不会显示总结果数。 似乎是临时解决方案,甚至是永久解决方案。

  • 我正在尝试训练一个模型,在我看来,与其他数据集相比,该模型花费的时间太长,因为完成一个历元需要大约1小时和20分钟。我认为问题是因为数据集没有存储在ram上,但我不确定这一点。 代码如下: 型号: 顺序模型 2个卷积层,32个神经元,激活=relu 1个卷积层,64个神经元,激活=relu 平整和致密层,激活=relu 退出0.5 具有sigmoid激活的输出层(致密) Adam optimize

  • 我试图创建一个Hazelcast服务项目,其中我将订阅一个RDBMS(Oracle DB 12c)数据存储,使用反射动态创建一个POJO/JavaBean,然后解析JavaBean对象以映射JDBC ResultSet作为结果行值放入JavaBean对象,并将这些映射对象加载到分布式映射中。 我检查了两个表的数据量,我试图从这两个表加载在Hazelcast IMap中,它低至0.0625和0.03

  • 问题内容: 我试图在Java中找到斐波那契数列的总和,但是运行时间太长了(或者应该吗?)。每当我使用40以上的整数时,这都会减慢速度。 注意:在50时,返回的负值使我感到困惑。 有什么建议吗? 问题答案: 对于,您的递归调用会两次调用自身。这些调用中的每一个都可以进一步递归。方法调用的总数缩放为,并且是一个非常大的数字。这种糟糕的缩放比例反映了以下事实:简单的递归方法最终会不必要地多次重新计算相同

  • 我将cxf库用于web服务客户端。 当响应延迟了大约5秒时,cxf需要大约20秒来返回响应。ws返回33912长响应。 不过,客户对快速响应没有问题。 我找不到问题所在。我测试了wsendpoint,它在8秒内返回最大值。但cxf客户端有时需要30-50秒。 我打开了调试日志,这两行之间需要9秒 2018-01-11 17:17:14.022调试10492--[nio-8086-exec-6]o.

  • 计算一个函数执行的时间。 使用 console.time() 和 console.timeEnd() 来测量开始和结束时间之间的差,以确定回调执行的时间。 const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); ret