API Java ElasticSearch: NoNodeAvailableException: aucun nœud disponible
public static void main(String[] args) throws IOException {
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", "foxzen")
.put("node.name", "yu").build();
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("XXX.XXX.XXX.XXX", 9200));
// XXX is my server's ip address
IndexResponse response = client.prepareIndex("twitter", "tweet")
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("productId", "1")
.field("productName", "XXX").endObject()).execute().actionGet();
System.out.println(response.getIndex());
System.out.println(response.getType());
System.out.println(response.getVersion());
client.close();
}
J'accède au serveur depuis mon ordinateur
curl -get http://XXX.XXX.XXX.XXX:9200/
Obtenez ceci
{
"status" : 200,
"name" : "yu",
"version" : {
"number" : "1.1.0",
"build_hash" : "2181e113dea80b4a9e31e58e9686658a2d46e363",
"build_timestamp" : "2014-03-25T15:59:51Z",
"build_snapshot" : false,
"lucene_version" : "4.7"
},
"tagline" : "You Know, for Search"
}
Pourquoi obtenir une erreur en utilisant L'API Java?
Modifier
Il y a la configuration de la partie cluster et node de elasticsearch.yml
################################### Cluster ###################################
# Cluster name identifies your cluster for auto-discovery. If you're running
# multiple clusters on the same network, make sure you're using unique names.
#
cluster.name: foxzen
#################################### Node #####################################
# Node names are generated dynamically on startup, so you're relieved
# from configuring them manually. You can tie this node to a specific name:
#
node.name: yu
8 réponses
Quelques suggestions:
1-Utiliser le port 9300. [9300-9400] est pour la communication nœud à nœud, [9200-9300] est pour le trafic HTTP.
2-Assurez-vous que la version de L'API Java que vous utilisez correspond à la version d'elasticsearch exécutée sur le serveur.
3-Assurez-vous que le nom de votre cluster est foxzen
(Vérifiez elasticsearch.yml sur le serveur).
4-Remove put("node.name", "yu")
, vous ne Rejoignez pas le cluster en tant que nœud puisque vous utilisez le TransportClient
, et même si vous l'étiez, il apparaît votre nœud de serveur est nommé yu
de sorte que vous voudriez un nom de nœud différent dans tous les cas.
Vous devez changer votre code pour utiliser le port 9300-la ligne correcte serait:
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("XXX.XXX.XXX.XXX", 9300));
La raison en est que L'API Java utilise le transport interne utilisé pour les communications entre nœuds et qu'elle utilise par défaut le port 9300. Le Port 9200 est la valeur par défaut pour L'interface de L'API REST. Problème commun à rencontrer-vérifiez cet exemple de code ici vers le bas de la page, sous Transport Client:
Http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html
// on startup
Client client = new TransportClient()
.addTransportAddress(new InetSocketTransportAddress("host1", 9300))
.addTransportAddress(new InetSocketTransportAddress("host2", 9300));
// on shutdown
client.close();
J'ai rencontré cette erreur aussi. J'utilise ElasticSearch 2.4.1 comme serveur autonome (nœud unique) dans docker, programmation avec Grails 3/spring-data-elasticsearch. Mon correctif définit client.transport.sniff
à false
. Voici ma conf de Base:
Application.yml
spring.data.elasticsearch:
cluster-name: "my-es"
cluster-nodes: "localhost:9300"
properties:
"client.transport.ignore_cluster_name": true
"client.transport.nodes_sampler_interval": "5s"
"client.transport.ping_timeout": "5s"
"client.transport.sniff": false # XXX : notice here
repositories.enabled: false
Voir ce
Je suppose que vous définissez le serveur ES sur un hôte distant? Dans ce cas, vous devrez lier l'adresse de publication à l'adresse IP publique de l'hôte.
Dans votre hôte es, modifiez /etc/elasticsearch/elasticsearch.yml
et ajoutez son adresse IP publique après le réseau.publish_host:
# Set the address other nodes will use to communicate with this node. If not
# set, it is automatically derived. It must point to an actual IP address.
#
network.publish_host: 192.168.0.1
Et dans votre code connectez-vous à cet hôte sur le port 9300. Notez que vous avez besoin de L'IP et non du nom de domaine (au moins selon mon expérience sur Amazon EC2)
Si vous rencontrez toujours des problèmes, même lorsque vous utilisez le port 9300, et que tout le reste semble être configuré correctement, essayez d'utiliser une ancienne version d'elasticsearch.
Je recevais cette même erreur en utilisant elasticsearch version 2.2.0, mais dès que je suis revenu à la version 1.7.5, mon problème a disparu comme par magie. Voici un lien vers quelqu'un d'autre ayant ce problème: l'ancienne version résout le problème
Pour les personnes ayant des problèmes similaires, j'ai reçu ceci parce que je n'avais pas défini cluster.name
dans le constructeur TransportClient
. Ajout de la propriété et tout a fonctionné.
Autre raison pourrait être, votre Elasticsearch client Java est une version différente de votre Elasticsearch serveur.
La version du client Java Elasticsearch N'est rien d'autre que votre version jar elasticsearch dans votre base de code.
Par exemple: Dans mon code c'est elasticsearch-2.4.0.jar
Pour vérifier la version D'Elasticsearch server,
$ /Users/kkolipaka/elasticsearch/bin/elasticsearch -version
Version: 5.2.2, Build: f9d9b74/2017-02-24T17:26:45.835Z, JVM: 1.8.0_111
Comme vous pouvez le voir, j'ai téléchargé la dernière version D'Elastic server 5.2.2 mais j'ai oublié de mettre à jour L'ES Java API client version 2.4.0 https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/client.html
Une autre solution peut consister à inclure explicitement io.netty.netty-all
dans les dépendances du projet.
Sur addTransportAddresses
une méthode nodesSampler.sample()
est en cours d'exécution, et les adresses ajoutées sont vérifiées pour leur disponibilité.
Dans mon cas try-catch
bloc avale ConnectTransportException
parce qu'une méthode io.netty.channel.DefaultChannelId.newInstance()
ne peut pas être trouvée. Donc, le nœud ajouté n'est tout simplement pas traité comme disponible.