org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []

daydreamer picture daydreamer · Aug 28, 2015 · Viewed 13.7k times · Source

I am running ElasticSearch on Docker which is available locally as

$ curl http://192.168.99.100:9200/?pretty
{
  "status" : 200,
  "name" : "Collector",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.4.4",
    "build_hash" : "c88f77ffc81301dfa9dfd81ca2232f09588bd512",
    "build_timestamp" : "2015-02-19T13:05:36Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.3"
  },
  "tagline" : "You Know, for Search"
}

I am using Elastic4s, for connecting to ElasticSearch, I tried following approach, but all of them gave me error as

val client = ElasticClient.remote(host = "192.168.99.100", port = 9200)

and

val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build()
  val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9200")
  val client = ElasticClient.remote(uri)

The error is

Exception in thread "main" org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []
    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:305)
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:200)
    at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.java:106)
    at org.elasticsearch.client.support.AbstractClient.index(AbstractClient.java:102)
    at org.elasticsearch.client.transport.TransportClient.index(TransportClient.java:340)
    at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$$anonfun$apply$1.apply(IndexDsl.scala:23)
    at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$$anonfun$apply$1.apply(IndexDsl.scala:23)
    at com.sksamuel.elastic4s.Executable$class.injectFuture(Executable.scala:21)
    at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$.injectFuture(IndexDsl.scala:20)
    at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$.apply(IndexDsl.scala:23)
    at com.sksamuel.elastic4s.IndexDsl$IndexDefinitionExecutable$.apply(IndexDsl.scala:20)
    at com.sksamuel.elastic4s.ElasticClient.execute(ElasticClient.scala:28)
    at com.enterpriseconnector.persistence.Elastic$.insert(Elastic.scala:17)
    at com.enterpriseconnector.persistence.Test$$anonfun$1.apply(Elastic.scala:27)
    at com.enterpriseconnector.persistence.Test$$anonfun$1.apply(Elastic.scala:24)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
    at scala.collection.immutable.Range.foreach(Range.scala:166)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at com.enterpriseconnector.persistence.Test$.delayedEndpoint$com$enterpriseconnector$persistence$Test$1(Elastic.scala:24)
    at com.enterpriseconnector.persistence.Test$delayedInit$body.apply(Elastic.scala:23)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.App$class.main(App.scala:76)
    at com.enterpriseconnector.persistence.Test$.main(Elastic.scala:23)
    at com.enterpriseconnector.persistence.Test.main(Elastic.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

My complete code is

import java.util.Calendar

import com.sksamuel.elastic4s.{ElasticsearchClientUri, ElasticClient}
import com.sksamuel.elastic4s.ElasticDsl._
import com.sksamuel.elastic4s.source.StringDocumentSource
import org.elasticsearch.common.settings.ImmutableSettings

object Elastic {
  println("Creating Elastic Connection")
  val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build()
  val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9200")
  val client = ElasticClient.remote(uri)

  def insert(monitorJson: String) = {
    client execute {
      index into "test" -> "elastic4s" doc StringDocumentSource(monitorJson)
    }
  }
}

object Test extends App {
  for (_ <- 1 to 100) yield {
    val json: String = s"{time: ${Calendar.getInstance().getTime()}}"
    println(s"inserting ${json}")
    Elastic.insert(json)
  }
}

Answer

Val picture Val · Aug 29, 2015

9200 is the port for connecting via HTTP, which is why it works from your browser. If you check you the top of your stack trace, you can see in your case that you're connecting via the Transport client (i.e. TCP) so you need to use the port 9300 instead. Try this:

val uri = ElasticsearchClientUri("elasticsearch://192.168.99.100:9300")
val client = ElasticClient.remote(uri)