web-dev-qa-db-fra.com

Java ElasticSearch Aucun des nœuds configurés n'est disponible.

Vient de télécharger et d'installer elasticsearch 1.3.2 il y a une heure

Tables IP ouvertes pour le port 9200 et 9300: 9400

Définir le nom de mon ordinateur et mon adresse IP dans/etc/hosts

Head Module et Paramédic installés et fonctionnant sans à-coups

boucle sur localhost fonctionne parfaitement

copié tous les fichiers jar du téléchargement dans Eclipse afin que le même client version

- Java -

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;


public class Test{         
    public static void main(String[] args) {
        Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elastictest").build();
            TransportClient transportClient = new TransportClient(settings);
                Client client = transportClient.addTransportAddress(new InetSocketTransportAddress("143.79.236.xxx",9300));//just masking ip with xxx for SO Question

            try{
                SearchResponse response = client.prepareSearch().setQuery(QueryBuilders.matchQuery("url", "Twitter")).setSize(5).execute().actionGet();//bunch of urls indexed
                    String output = response.toString();
                        System.out.println(output);
            }catch(Exception e){
                e.printStackTrace();
            }
                client.close();
        }
}

- Sortie -

log4j:WARN No appenders could be found for logger (org.elasticsearch.plugins).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.Apache.org/log4j/1.2/faq.html#noconfig for more info.
org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []
    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.Java:298)
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.Java:214)
    at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.Java:105)
    at org.elasticsearch.client.support.AbstractClient.search(AbstractClient.Java:330)
    at org.elasticsearch.client.transport.TransportClient.search(TransportClient.Java:421)
    at org.elasticsearch.action.search.SearchRequestBuilder.doExecute(SearchRequestBuilder.Java:1097)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.Java:91)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.Java:65)
    at Test.main(Test.Java:20)

Mise à jour: maintenant je suis vraiment confus. Je viens d'appuyer 3 fois sur Eclipse. 2 fois reçu l'erreur ci-dessus. 1 fois la recherche a fonctionné! ?? Centos 6.5 vps neuf, jdk neuf installé. Ensuite, elasticsearch installé, n'ont rien fait d'autre pour boxer.

Mise à jour: après avoir exécuté la console ./bin/elasticsearch

[2014-09-18 08:56:13,694][INFO ][node                     ] [Acrobat] version[1.3.2], pid[2978], build[dee175d/2014-08-13T14:29:30Z]
[2014-09-18 08:56:13,695][INFO ][node                     ] [Acrobat] initializing ...
[2014-09-18 08:56:13,703][INFO ][plugins                  ] [Acrobat] loaded [], sites [head, paramedic]
[2014-09-18 08:56:15,941][WARN ][common.network           ] failed to resolve local Host, fallback to loopback
Java.net.UnknownHostException: elasticsearchtest: elasticsearchtest: Name or service not known
        at Java.net.InetAddress.getLocalHost(InetAddress.Java:1473)
        at org.elasticsearch.common.network.NetworkUtils.<clinit>(NetworkUtils.Java:54)
        at org.elasticsearch.transport.netty.NettyTransport.<init>(NettyTransport.Java:204)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:57)
        at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
        at Java.lang.reflect.Constructor.newInstance(Constructor.Java:526)
        at org.elasticsearch.common.inject.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.Java:54)
        at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:86)
        at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
        at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
        at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
        at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
        at org.elasticsearch.common.inject.FactoryProxy.get(FactoryProxy.Java:52)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
        at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
        at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
        at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
        at org.elasticsearch.common.inject.SingleParameterInjector.inject(SingleParameterInjector.Java:42)
        at org.elasticsearch.common.inject.SingleParameterInjector.getAll(SingleParameterInjector.Java:66)
        at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:85)
        at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
        at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
        at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
        at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
        at org.elasticsearch.common.inject.SingleParameterInjector.inject(SingleParameterInjector.Java:42)
        at org.elasticsearch.common.inject.SingleParameterInjector.getAll(SingleParameterInjector.Java:66)
        at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:85)
        at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
        at org.elasticsearch.common.inject.FactoryProxy.get(FactoryProxy.Java:52)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
        at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
        at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
        at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
        at org.elasticsearch.common.inject.SingleParameterInjector.inject(SingleParameterInjector.Java:42)
        at org.elasticsearch.common.inject.SingleParameterInjector.getAll(SingleParameterInjector.Java:66)
        at org.elasticsearch.common.inject.ConstructorInjector.construct(ConstructorInjector.Java:85)
        at org.elasticsearch.common.inject.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.Java:98)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.Java:45)
        at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:837)
        at org.elasticsearch.common.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.Java:42)
        at org.elasticsearch.common.inject.Scopes$1$1.get(Scopes.Java:57)
        at org.elasticsearch.common.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.Java:45)
        at org.elasticsearch.common.inject.InjectorBuilder$1.call(InjectorBuilder.Java:200)
        at org.elasticsearch.common.inject.InjectorBuilder$1.call(InjectorBuilder.Java:193)
        at org.elasticsearch.common.inject.InjectorImpl.callInContext(InjectorImpl.Java:830)
        at org.elasticsearch.common.inject.InjectorBuilder.loadEagerSingletons(InjectorBuilder.Java:193)
        at org.elasticsearch.common.inject.InjectorBuilder.injectDynamically(InjectorBuilder.Java:175)
        at org.elasticsearch.common.inject.InjectorBuilder.build(InjectorBuilder.Java:110)
        at org.elasticsearch.common.inject.Guice.createInjector(Guice.Java:93)
        at org.elasticsearch.common.inject.Guice.createInjector(Guice.Java:70)
        at org.elasticsearch.common.inject.ModulesBuilder.createInjector(ModulesBuilder.Java:59)
        at org.elasticsearch.node.internal.InternalNode.<init>(InternalNode.Java:192)
        at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.Java:159)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.Java:70)
        at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.Java:203)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.Java:32)
Caused by: Java.net.UnknownHostException: elasticsearchtest: Name or service not known
        at Java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
        at Java.net.InetAddress$1.lookupAllHostAddr(InetAddress.Java:901)
        at Java.net.InetAddress.getAddressesFromNameService(InetAddress.Java:1293)
        at Java.net.InetAddress.getLocalHost(InetAddress.Java:1469)
        ... 62 more
[2014-09-18 08:56:16,937][INFO ][node                     ] [Acrobat] initialized
[2014-09-18 08:56:16,937][INFO ][node                     ] [Acrobat] starting ...
[2014-09-18 08:56:17,110][INFO ][transport                ] [Acrobat] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/143.79.236.31:9300]}
[2014-09-18 08:56:17,126][INFO ][discovery                ] [Acrobat] elastictest/QvSNFajjQ9SFjU7WOdjaLw
[2014-09-18 08:56:20,145][INFO ][cluster.service          ] [Acrobat] new_master [Acrobat][QvSNFajjQ9SFjU7WOdjaLw][localhost][inet[/143.79.236.31:9300]], reason: zen-disco-join (elected_as_master)
[2014-09-18 08:56:20,212][INFO ][http                     ] [Acrobat] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/143.79.236.31:9200]}
[2014-09-18 08:56:20,214][INFO ][node                     ] [Acrobat] started

- configuration du cluster dans 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: elastictest
51
Chris

Les paramètres Elasticsearch sont dans $ES_HOME/config/elasticsearch.yml. Là, si le paramètre cluster.name est commenté, cela signifie que ES prendrait à peu près n'importe quel nom de cluster. Donc, dans votre code, le cluster.name en tant que "elastictest" pourrait être le problème. Essaye ça:

Client client = new TransportClient()
                .addTransportAddress(new InetSocketTransportAddress(
                        "143.79.236.xxx",
                        9300));
34
Aritra

problème possible:

  1. mauvais port, si vous utilisez un client Java ou Scala, le port correct est 9300, pas 9200
  2. nom de cluster incorrect, assurez-vous que le nom de cluster que vous avez défini dans votre code est identique à celui de cluster.name que vous avez défini dans $ES_HOME/config/elasticsearch.yml
  3. l'option de détection, définissez client.transport.sniff sur true mais ne pouvez pas vous connecter à tous les nœuds du cluster ES, ce qui entraînera également ce problème. ES doc here expliqué pourquoi.
34
backingwu

Vous devriez vérifier le port du noeud, vous pouvez le faire en utilisant head. Ces ports ne sont pas les mêmes. Exemple,

L'URL Web que vous pouvez ouvrir est localhost:9200, mais le port du nœud est 9300. Par conséquent, aucun des nœuds configurés n'est disponible si vous utilisez 9200 comme port.

14
fmyblack

Face à un problème similaire, et voici la solution

Exemple :

  1. Dans elasticsearch.yml, ajoutez les propriétés ci-dessous

    cluster.name: production
    node.name: node1
    network.bind_Host: 10.0.1.22
    network.Host: 0.0.0.0
    transport.tcp.port: 9300
    
  2. Ajoutez les éléments suivants dans Java API Elastic pour Bulk Push (juste un extrait de code). Pour l'adresse IP, ajoutez l'adresse IP publique du moteur de recherche élastique

    Client client;
    BulkRequestBuilder requestBuilder;
    try {
        client = TransportClient.builder().settings(Settings.builder().put("cluster.name", "production").put("node.name","node1")).build().addTransportAddress(
        new InetSocketTransportAddress(InetAddress.getByName(""), 9300));
        requestBuilder = (client).prepareBulk();
    } 
    catch (Exception e) {
    }
    
  3. Ouvrez les ports du pare-feu pour 9200,9300

4
Anantha
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{UfB9geJCR--spyD7ewmoXQ}{192.168.1.245}{192.168.1.245:9300}]]

Dans mon cas, c'était la différence entre les versions. Si vous consultez les journaux dans le cluster elasticsearch, vous verrez s'afficher.

Journaux Elasticsearch

[node1] exception caught on transport layer [NettyTcpChannel{localAddress=/192.168.1.245:9300, remoteAddress=/172.16.1.47:65130}], closing connection
Java.lang.IllegalStateException: Received message from unsupported version: [5.0.0] minimal compatible version is: [5.6.0]

J'utilisais le client elasticsearch et la version de transport 5.1.1. Et ma version du cluster elasticsearch était dans la version 6. Je change donc la version de ma bibliothèque en 5.4.3.

4
Dushmantha

Si les conseils ci-dessus ne fonctionnent pas, modifiez le niveau de journalisation de la configuration de votre structure de journalisation (log4j, logback ...) en INFO. Puis revérifiez la sortie.

L'enregistreur peut cacher des messages tels que:

INFO  org.elasticsearch.client.transport.TransportClientNodesService - failed to get node info for...
Caused by: ElasticsearchSecurityException: missing authentication token for action...

(Dans l'exemple ci-dessus, il y avait un plugin X-Pack dans ElasticSearch qui nécessite une authentification)

3
Dimitar II

Pour terminer, voici l'extrait qui crée le client de transport en utilisant la méthode statique appropriée fournie par InetSocketTransportAddress:

    Client esClient = TransportClient.builder()
        .settings(settings)
        .build()
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("143.79.236.xxx"), 9300));
3
Philip M.

Pour les autres utilisateurs rencontrant ce problème.

Vous pouvez obtenir cette erreur si vous exécutez un ElasticSearch plus récent (5.5 ou version ultérieure) lors de l’exécution de la version Spring Boot <2.

La recommandation est d'utiliser le client REST, car le client Java sera obsolète.

Une autre solution consiste à effectuer une mise à niveau vers Spring Boot 2, étant donné que cela devrait être compatible.

Voir https://discuss.elastic.co/t/spring-data-elasticsearch-cant-connect-connect-with-elasticsearch-5-5-0/94235 pour plus d'informations.

2
nesohc

Je passe des jours ensemble à résoudre ce problème. Je sais qu'il est tard, mais cela pourrait être utile:

J'ai résolu ce problème en modifiant la version compatible/stable de:

Spring boot: 2.1.1
Spring Data Elastic: 2.1.4
Elastic: 6.4.0 (default)

Maven:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>

Vous n'avez pas besoin de mentionner la version Elastic. Par défaut, c'est 6.4.0. Mais si vous voulez ajouter une version spécifique. Utilisez l'extrait de code de propriété ci-dessous et utilisez la version compatible de Spring Boot et Spring Data (si nécessaire).

<properties>
<elasticsearch.version>6.8.0</elasticsearch.version>
</properties>

De plus, j'ai utilisé le client Rest High Level dans ElasticConfiguration:

@Value("${elasticsearch.Host}")
public String Host;

@Value("${elasticsearch.port}")
public int port;

@Bean(destroyMethod = "close")
public RestHighLevelClient restClient1() {
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    RestClientBuilder builder = RestClient.builder(new HttpHost(Host, port));
    RestHighLevelClient client = new RestHighLevelClient(builder);
    return client;
    }
}

Remarque importante: Elastic utilise le port 9300 pour communiquer entre les nœuds et 9200 en tant que client HTTP. Dans les propriétés d'application:

elasticsearch.Host=10.40.43.111
elasticsearch.port=9200

spring.data.elasticsearch.cluster-nodes=10.40.43.111:9300 (customized Elastic server)
spring.data.elasticsearch.cluster-name=any-cluster-name (customized cluster name)

Depuis Postman, vous pouvez utiliser: http://10.40.43.111:9200/ [indexname]/_search

Bonne codage :)

1
Sdembla

Comme la plupart des réponses semblent obsolètes, voici le réglage qui a fonctionné pour moi:

  • Elasticsearch-Version: 7.2.0 (OSS) s'exécutant sur Docker
  • Java-Version: JDK-11

elasticsearch.yml:

cluster.name: production
node.name: node1
network.Host: 0.0.0.0
transport.tcp.port: 9300
cluster.initial_master_nodes: node1

Installer:

client = new PreBuiltTransportClient(Settings.builder().put("cluster.name", "production").build());
client.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300));

Puisque PreBuiltTransportClient est obsolète, vous devez utiliser RestHighLevelClient pour Elasticsearch-Version 7.3.0: https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-level-level-lient-client/7.3. 0/index.html

1
Douy789

Vérifiez votre propriété elasticsearch.yml. La propriété "transport.Host" doit être "0.0.0.0" et non "127.0.0.1" ou "localhost".

0
Romain DEQUIDT

Celui-ci a fonctionné pour moi dans ES 1.7.5:

import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;

public static void main(String[] args) throws IOException  {
    Settings settings = ImmutableSettings.settingsBuilder()
            .put("client.transport.sniff",true)
            .put("cluster.name","elasticcluster").build();

    Client client = new TransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress("[ipaddress]",9300));
    XContentBuilder builder = null;
    try {
        builder = jsonBuilder().startObject().field("user", "testdata").field("postdata",new Date()).field("message","testmessage")
                .endObject();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println(builder.string());

    IndexResponse response = client.prepareIndex("Twitter","Tweet","1").setSource(builder).execute().actionGet();

    client.close();

}

0
BenCes

Cela signifie que nous ne sommes pas en mesure d'instancier ES transportClient et de lever cette exception. Il existe plusieurs possibilités qui causent ce problème.

  • Le nom du cluster est incorrect. Alors ouvrez le fichier ES_HOME_DIR/config/elasticserach.yml et vérifiez la valeur du nom du cluster OR utilisez cette commande: curl -XGET 'http://localhost:9200/_nodes'
  • Vérifiez que le port 9200 est le port http, mais le service elasticsearch utilise le port TCP 9300 [par défaut]. Vérifiez donc que le port n'est pas bloqué.
  • Problème d'authentification: définissez l'en-tête dans le contexte de transportClient pour l'authentification:

    client.threadPool().getThreadContext()
      .putHeader("Authorization", "Basic " + encodeBase64String(basicHeader.getBytes()));
    

Si vous êtes toujours confronté à ce problème, ajoutez la propriété suivante:

put("client.transport.ignore_cluster_name", true)

Le code de base ci-dessous fonctionne bien pour moi:

Settings settings = Settings.builder()
            .put("cluster.name", "my-application").put("client.transport.sniff", true).put("client.transport.ignore_cluster_name", false).build();
    TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
0
Rajeev Rathor

Si vous utilisez Java client de transport 1.check 9300 est accessible/ouvert. 2.cochez le nom du nœud et du cluster, cela devrait être correct, vous pouvez vérifier le nom du nœud et du cluster par type ip: port dans votre navigateur. 3.Vérifiez les versions de votre jar et de la version installée de Es.

0
prasad kp