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
21
demandé sur Joe 2014-05-07 18:31:48

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.

30
répondu hudsonb 2015-08-13 18:00:36

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();
10
répondu John Petrone 2014-05-07 20:10:06

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

2
répondu btpka3 2016-10-19 02:44:58

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)

1
répondu Amit Goldstein 2015-06-24 14:31:26

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

0
répondu rrudland 2016-02-12 16:12:22

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é.

0
répondu Joseph Lust 2016-06-16 18:35:48

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

0
répondu Kondal Kolipaka 2017-03-14 00:03:23

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.

0
répondu N. Kudryavtsev 2017-12-10 01:28:06