elasticsearch-java中使用ES的API启用报错

在使用Elasticsearch 6.2版本和Kibana 6.2版本的Java项目中,遇到启动时的API报错。通过分析,发现报错与Elasticsearch配置和POM中jar包版本有关。首先尝试修改`elasticsearch.yml`文件未解决问题,然后从日志中定位到jar包版本过低的问题。解决方案是更新POM文件中的jar包到与Elasticsearch版本兼容的版本,并相应调整main方法,最终成功创建连接。

【问题描述】:

1.说明:ElasticSearch版本为6.2,kibana版本为6.2

2.java项目中pom引用版本如下:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.2.2</version>
</dependency>

测试类中面方法如下

public static void main(String[] args) throws Exception {
    // 先构建client
    Settings settings = Settings.builder().put("cluster.name","elasticsearch").build();
    TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300));
    createEmployee(client);
    client.close();
}

启动程序后报错信息如下:

no modules loaded
loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
loaded plugin [org.elasticsearch.transport.Netty3Plugin]
loaded plugin [org.elasticsearch.transport.Netty4Plugin]
failed to get node info for {#transport#-1}{dRl3qDDhTaylpnHvI8Ukdg}{localhost}{127.0.0.1:9300}, disconnecting...
org.elasticsearch.transport.NodeDisconnectedException: [][127.0.0.1:9300][cluster:monitor/nodes/liveness] disconnected
Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{dRl3qDDhTaylpnHvI8Ukdg}{localhost}{127.0.0.1:9300}]]
    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:344)
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:242)
    at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
    at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:356)
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:54)
    at org.elasticsearch.action.ActionRequestBuilder.get(ActionRequestBuilder.java:62)
    at com.roocoo.es.score.first.EmployeeCRUDApp.createEmployee(EmployeeCRUDApp.java:37)
    at com.roocoo.es.score.first.EmployeeCRUDApp.main(EmployeeCRUDApp.java:19)


Process finished with exit code 1


【定为分析】:

1.思路一:根据报错信息

NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{dRl3qDDhTaylpnHvI8Ukdg}{localhost}{127.0.0.1:9300}]]”

百度查询,大部分为修改ElasticSearch/config/elasticsearch.yml文件,考虑可能为集群名配置、地址、端口配置问题

# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1
#
# Set a custom port for HTTP:
#
#http.port: 9200
#
# For more information, consult the network module documentation.

尝试如下:

1.1 network.host解注后,报错:java.net.BindException: Cannot assign requested address: bind,IP地址变化导致此问题。

1.2 修改java代码中的localhost为实际IP地址,或者127.0.0.1均不可解决。

InetAddress.getByName("localhost")

2.思路二:从elasticsearch运行日志入手,查看日志,关键如红色标注

[2018-05-17T13:52:49,611][WARN ][o.e.t.n.Netty4Transport  ] [yWbGC_X] exception
caught on transport layer [NettyTcpChannel{localAddress=/127.0.0.1:9300, remoteA
ddress=/127.0.0.1:55958}], closing connection
java.lang.IllegalStateException: Received message from unsupported version: [5.2
.2] minimal compatible version is: [5.6.0]
        at org.elasticsearch.transport.TcpTransport.ensureVersionCompatibility(T
cpTransport.java:1430) ~[elasticsearch-6.2.4.jar:6.2.4]
        at org.elasticsearch.transport.TcpTransport.messageReceived(TcpTransport
.java:1377) ~[elasticsearch-6.2.4.jar:6.2.4]
        at org.elasticsearch.transport.netty4.Netty4MessageChannelHandler.channe
lRead(Netty4MessageChannelHandler.java:64) ~[transport-netty4-6.2.4.jar:6.2.4]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
ctChannelHandlerContext.java:340) [netty-transport-4.1.16.Final.jar:4.1.16.Final
]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMes
sageDecoder.java:310) [netty-codec-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMes
sageDecoder.java:297) [netty-codec-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageD
ecoder.java:413) [netty-codec-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessage
Decoder.java:265) [netty-codec-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
ctChannelHandlerContext.java:340) [netty-transport-4.1.16.Final.jar:4.1.16.Final
]
        at io.netty.handler.logging.LoggingHandler.channelRead(LoggingHandler.ja
va:241) [netty-handler-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
ctChannelHandlerContext.java:340) [netty-transport-4.1.16.Final.jar:4.1.16.Final
]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(Defau
ltChannelPipeline.java:1359) [netty-transport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:362) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
ractChannelHandlerContext.java:348) [netty-transport-4.1.16.Final.jar:4.1.16.Fin
al]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChanne
lPipeline.java:935) [netty-transport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(Abstra
ctNioByteChannel.java:134) [netty-transport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.jav
a:645) [netty-transport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLo
op.java:545) [netty-transport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.ja
va:499) [netty-transport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) [netty-t
ransport-4.1.16.Final.jar:4.1.16.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThread
EventExecutor.java:858) [netty-common-4.1.16.Final.jar:4.1.16.Final]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
[2018-05-17T13:55:32,015][INFO ][o.e.c.m.MetaDataCreateIndexService] [yWbGC_X] [
company] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], m
appings []

尝试修改pom中jar包版本

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.0.1</version>
</dependency>

修改后API存在差异,需要修改main方法如下:

public static void main(String[] args) throws Exception {
	// 先构建client
	Settings settings = Settings.builder().put("cluster.name","elasticsearch").build();
    TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"),9300));
    createEmployee(client);
    client.close();
}

重新运行程序,创建成功

no modules loaded
loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
loaded plugin [org.elasticsearch.transport.Netty4Plugin]
CREATED

Process finished with exit code 0


【问题根因】:

pom文件中引用jar包版本过低;

【解决方案】:

修改pom中jar包版本

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.0.1</version>
</dependency>

修改后API存在差异,需要修改main方法如下:

public static void main(String[] args) throws Exception {
	// 先构建client
	Settings settings = Settings.builder().put("cluster.name","elasticsearch").build();
    TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"),9300));
    createEmployee(client);
    client.close();
}

重新运行程序

ESAPIElasticsearch API报错通常由多种原因引起,具体取决于报错的上下文、调用的API类型以及集群的配置和状态。以下是几种常见的ESAPI报错原因及其对应的解决方案: ### 1. **内存溢出(OutOfMemoryError)** 在执行大规模数据同步或聚合操作时,Elasticsearch可能会因为堆内存不足而抛出内存溢出异常。尤其是在处理大体积数据或复杂脚本时,这种情况更为常见。 - **原因**: - 数据量过大导致JVM堆内存不足。 - 聚合或脚本操作未进行范围限制,扫描了大量文档。 - 索引分片数过多,导致查询过程中需要合并大量结果。 - **解决方案**: - 增加Elasticsearch节点的JVM堆内存配置(`ES_HEAP_SIZE`),但不要超过物理内存的50%。 - 对查询进行分页或使用`search_after`参数避免一次性获取大量数据。 - 使用过滤器限制脚本执行的数据范围,避免全索引扫描[^1]。 ### 2. **空字段访问导致的脚本错误** 在使用Painless脚本进行聚合或查询时,如果尝试访问不存在的字段,可能会导致空指针异常。 - **原因**: - 脚本中访问了可能不存在的字段且未做空值判断。 - 字段类型不匹配,例如对`null`值进行数值运算。 - **解决方案**: - 在脚本中使用安全访问方式,如`params._source.containsKey('field') ? params._source.field : 0`。 - 使用`doc.containsKey()`方法判断字段是否存在后再进行操作。 - 启用缓存脚本机制,避免重复编译,提高性能并减少出错概率[^2]。 ### 3. **版本不兼容错误** 当客户端与Elasticsearch服务器版本不一致时,可能会出现版本不兼容的错误,例如: ``` java.lang.IllegalStateException: Received message from unsupported version: [5.2.2] minimal compatible version is: [5.6.0] ``` - **原因**: - 客户端使用ES版本低于集群所支持的最低版本。 - 节点之间通信协议不一致。 - **解决方案**: - 升级客户端版本,使其与集群版本兼容。 - 如果使用的是Java High Level REST Client,建议迁移到新的Java API Client(适用于ES 7.17+)。 - 统一集群中所有节点的Elasticsearch版本。 ### 4. **索引不存在或未正确初始化** 当尝试访问一个尚未创建的索引时,API会抛出`index_not_found_exception`。 - **原因**: - 索引尚未创建。 - 索引名称拼写错误或大小写不一致。 - **解决方案**: - 在执行查询前确认索引是否存在,可以使用`HEAD /index_name` API进行检查。 - 使用模板(Index Template)确保索引自动创建时结构一致。 - 启用别名机制,避免直接依赖索引名称。 ### 5. **权限不足或安全认证失败** 在启用了安全功能的Elasticsearch集群中,如果用户未正确配置权限或认证失败,将导致API调用被拒绝。 - **原因**: - 用户未被授予相应权限(如`manage权限`或索引级权限)。 - 认证凭据(如用户名、密码、API Key)错误或过期。 - **解决方案**: - 检查用户角色权限配置,确保其具有所需操作的权限。 - 使用Kibana或Elasticsearch API管理API Key,确保其有效。 - 在客户端配置中正确设置认证信息(如Basic Auth、Bearer Token)。 ### 6. **脚本执行超时或资源限制** 当脚本执行时间过长或占用资源过高时,Elasticsearch会主动中断脚本执行以防止系统崩溃。 - **原因**: - 脚本逻辑复杂,计算密集。 - 脚本执行时间超过默认限制(可通过`script.max_compilation_rate`和`script.max_cached_scripts`调整)。 - **解决方案**: - 简化脚本逻辑,避免嵌套循环和复杂计算。 - 使用Groovy脚本替代Painless(仅适用于旧版本ES)。 - 调整脚本执行策略,允许更高并发或更长时间的执行。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值