如何在6.2版本中启动弹性搜索时修复“ java.lang.ArrayIndexOutOfBoundsException”异常

时间:2019-06-27 00:41:13

标签: elasticsearch

弹性搜索服务器未在新节点上启动。它失败并显示以下错误:

[2019-06-27T00:16:01,471][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-10] fatal error in thread [main], exiting
java.lang.ExceptionInInitializerError: null
    at java.lang.Class.forName0(Native Method) ~[?:1.8.0_212]
    at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_212]
    at org.elasticsearch.painless.Definition.addStruct(Definition.java:753) ~[?:?]
    at org.elasticsearch.painless.Definition.<init>(Definition.java:566) ~[?:?]
    at org.elasticsearch.painless.PainlessScriptEngine.<init>(PainlessScriptEngine.java:106) ~[?:?]
    at org.elasticsearch.painless.PainlessPlugin.getScriptEngine(PainlessPlugin.java:59) ~[?:?]
    at org.elasticsearch.script.ScriptModule.<init>(ScriptModule.java:69) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.node.Node.<init>(Node.java:327) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.node.Node.<init>(Node.java:246) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:213) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:213) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:323) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.2.2.jar:6.2.2]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-6.2.2.jar:6.2.2]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:85) ~[elasticsearch-6.2.2.jar:6.2.2]
Caused by: java.lang.ArrayIndexOutOfBoundsException: 4
    at java.time.chrono.JapaneseEra.<clinit>(JapaneseEra.java:179) ~[?:1.8.0_212]
    ... 19 more

我已经在GCP中的生产环境中运行了一个5节点集群。由于负载增加,因此我尝试向该群集添加更多节点。为了创建新节点,我使用了GCP提供的“创建相似”选项。我更新了节点名称之类的所有配置,并删除了/ var / lib / elasticsearch / nodes文件夹,并尝试在新节点上启动ES服务器。但是它总是会因上述错误而失败。

此节点使用OpenJDK 1.8。我为根记录器启用了跟踪日志,但是无法确定新节点出了什么问题。

请帮助确定此问题的根本原因。

1 个答案:

答案 0 :(得分:0)

理论解释:

公共类 ArrayIndexOutOfBoundsException 扩展了 IndexOutOfBoundsException

抛出该错误指示已使用非法索引访问了数组。索引为负或大于或等于数组的大小。

如何避免:

  1. 始终记住数组是从零开始的索引,第一个元素在第0个索引处,最后一个元素在长度-1个索引处。 因此,访问第一个元素将为您提供 java.lang.ArrayIndexOutOfBoundsException:0 Java中的错误。

在您的情况下,它是发生于:java.lang.ArrayIndexOutOfBoundsException:4

在遍历Java中的数组时,您应该始终避免一次性错误。程序员经常犯错误,导致第一个元素混乱,或者通过错误地在for循环中使用<,>,>> =或<=操作符来丢失数组的第一个或最后一个元素。

  1. 特别注意循环的开始和结束条件。
  2. 在代码中放置一些if-else块。

在这里,我已重现您的错误:

enter image description here