Reputation: 91
First for all, i'm sorry for my english. I have a problem with Java API Transport Client. I have one master node and three data nodes. Version of my Elasticsearch is 5.0.2 and i use 5.0.2 API.
I try to connect to my cluster with Transport Client and then i response
Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{8SAZOxXXTU61DuDDMN-vGw}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-2}{Fv3729YgTGClRBo5T2mWpA}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-3}{Fr98ApBbRv29Xv6Mc8L4TQ}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-4}{JOmpSH4LRzuP_XInxQtD9Q}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}]]
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:328)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:226)
at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:339)
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 nn.Main.main(Main.java:57)
That is my code of client:
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
public class Main {
private static String[] hosts = new String[] {
"XX.XX.X.XXX"
,"XX.XX.X.XXX"
,"XX.XX.X.XXX"
,"XX.XX.X.XXX"
};
private static final Settings settings = Settings.builder()
.put("cluster.name", "myCluster")
.put("client.transport.sniff", true)
.put("transport.tcp.port", 9300)
.put("xpack.security.user", "transport_client_user:changeme")
.build();
private static final String index = "myIndex";
private static final String type = "myType";
private static TransportClient client;
public static void main(String[] args) throws UnknownHostException {
InetSocketTransportAddress[] ista = new InetSocketTransportAddress[hosts.length];
for (int i = 0; i < hosts.length; i++) {
ista[i] = new InetSocketTransportAddress(InetAddress.getByName(hosts[i]), 9300);
}
client = new PreBuiltXPackTransportClient(settings).addTransportAddresses(ista);
SearchRequestBuilder rb = client
.prepareSearch(index)
.setTypes(type)
.setSearchType(SearchType.DEFAULT)
.setQuery(QueryBuilders.termQuery("_id", 3524598));
SearchResponse sResponse = rb.get();
System.out.println(sResponse.toString());
}
}
Port for transport client - 9300, all my nodes communicate under this port. I saw a lot like my question, and i trying to follow the advice contained in them. But i have the same exception.
If need more information or any files or settings of my Elastic - i'm ready to answer.
If it is important this is content of elasticsearch.yml
cluster.name: myCluster
node.name: elastic-0
path.data: /var/db/elasticsearch
path.logs: /var/log/elasticsearch
path.scripts: /usr/local/libexec/elasticsearch
network.host: _vmx0_
node.master: true
node.data: false
node.ingest: false
node.attr.rack_id: rack_one
cluster.routing.allocation.awareness.attributes: rack_id
discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.unicast.hosts: ["XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX"]
bootstrap.memory_lock: false
xpack.monitoring.exporters:
id1:
type: http
host: ["XX.XX.X.XXX:9200"]
auth.username: remote_monitor
auth.password: changeme
I tried to change TransportClient
on just Client
, and disable client.transport.sniff
but without result.
I will be very gratefull for any help or ideas.
Upvotes: 1
Views: 2885
Reputation: 950
This exception usually occurs when we try to use ES with TranscientClient (9300) and not with an API (9200).
These could be the reasons behind this:
Our IP address or the port that is provided is wrong. By default, the transport communication happens via 9300 until and unless we explicitly change in the elastisearch.yml
The IP address and the port is not reachable from the machine where we are running the Java Application. The ES machine is simply not reachable from Client Machine so we need to open the port and IP to the client.
If we change the 'transport.host' then ES considers as a prod environment and makes bootstrap checks. But in the scenario where the environment is not prod and we are running ES in one machine and trying to hit it from another machine with a transport client (Java app) then we can just add 'discovery.type: single-node'.
Change the Elastic Search yaml as follows:
cluster.name: elasticsearch
node.name: node-1
transport.host: 0.0.0.0
transport.tcp.port: 9300
http.port: 9200
network.host: 0.0.0.0
discovery.type: single-node
Upvotes: 0
Reputation: 91
I found the reason for which i received "NoNodeAvailableException".
The reason is transport_client's role does not grant permission to view the data in all indices on default. And i will to built my role for the access to data in indices.
Link: https://www.elastic.co/guide/en/x-pack/5.0/built-in-roles.html
Upvotes: 1