elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

ElasticSearch Java API:NoNodeAvailableException:无可用节点

ElasticSearch Java API:NoNodeAvailableException:无可用节点,java,elasticsearch,Java,elasticsearch,我从我的计算机访问服务器 public static void main(String[] args) throws IOException { Settings settings = ImmutableSettings.settingsBuilder() .put("cluster.name", "foxzen") .put("node.name", "yu").build(); Client client = new Trans

我从我的计算机访问服务器

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();
}
明白了吗

curl -get http://XXX.XXX.XXX.XXX:9200/
为什么使用JavaAPI会出现错误

编辑

elasticsearch.yml的集群和节点部分配置

{
    "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"
}
一些建议:

1-使用端口9300。[9300-9400]用于节点间通信,[9200-9300]用于HTTP通信

2-确保您使用的Java API版本与服务器上运行的elasticsearch版本匹配

3-确保集群的名称为
foxzen
(检查服务器上的elasticsearch.yml)


4-删除
put(“node.name”,“yu”)
,因为您使用的是
TransportClient
,所以您没有作为节点加入群集,即使您是,您的服务器节点似乎名为
yu
,因此您在任何情况下都需要不同的节点名称。

您需要更改代码以使用端口9300-正确的行为:

################################### 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
原因是Java API使用用于节点间通信的内部传输,默认为端口9300。端口9200是REST API接口的默认端口。遇到的常见问题-请在页面底部的Transport Client(传输客户端)下检查此示例代码:


我假设您正在远程主机上设置ES服务器?在这种情况下,您需要将发布地址绑定到主机的公共IP地址

在ES主机中编辑
/etc/elasticsearch/elasticsearch.yml
,并在网络后添加其公共IP。发布\u主机:

// on startup

Client client = new TransportClient()
        .addTransportAddress(new InetSocketTransportAddress("host1", 9300))
        .addTransportAddress(new InetSocketTransportAddress("host2", 9300));

// on shutdown

client.close();

在您的代码中,在端口9300上连接到此主机。请注意,您需要的是IP而不是域名(至少根据我在Amazon EC2上的经验)

如果您仍然存在问题,即使在使用端口9300时,并且所有其他配置似乎都正确,请尝试使用旧版本的elasticsearch


我在使用elasticsearch 2.2.0版时也遇到了同样的错误,但当我回到1.7.5版时,我的问题就神奇地消失了。这里有一个指向有此问题的其他人的链接:

对于有类似问题的人,我收到此链接是因为我没有在
TransportClient
生成器中设置
cluster.name
。添加了属性,一切正常。

我也遇到了这个错误。我使用ElasticSearch 2.4.1作为docker中的独立服务器(单节点),使用Grails 3/spring数据ElasticSearch进行编程。我的修复程序正在将
client.transport.sniff
设置为
false
。以下是我的核心配置:

application.yml

# 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

请参阅

其他原因可能是,您的Elasticsearch Java客户端与Elasticsearch服务器的版本不同

Elasticsearch Java客户端版本只是代码库中的Elasticsearchjar版本

例如:在我的代码中,它是elasticsearch-2.4.0.jar

要验证Elasticsearch服务器版本

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
如您所见,我下载了最新版本的Elastic server 5.2.2,但忘记更新ES Java API客户端版本2.4.0

另一种解决方案可能是将
io.netty.netty-all
明确地包含到项目依赖项中

addTransportAddresses
上,正在执行一个方法
NodeSampler.sample()
,并检查添加的地址是否可用。
在我的例子中,因为找不到方法
io.netty.channel.DefaultChannelId.newInstance()
,所以请尝试catch
block snowns
ConnectTransportException
。因此,添加的节点不被视为可用。

ElasticSearch Java API版本为0.19.9。我不知道如何检查ElasticSearch服务器的版本。你可以检查服务器上的安装目录吗?只需查看安装目录库文件夹,看看ElasticSearch jar是什么版本。可能有一种方法可以通过curl获得该版本,但我想不起来(如果可以的话,我不相信它能在这么旧的版本上工作)。您的服务器正在运行Elasticsearch 1.1.0版(它是
“number”:“1.1.0”
条目)在你的卷发请求的回复中,你在问题中发布了。我猜我是瞎子。根据我的第一个建议,升级您的Java客户端以使用elasticsearch-1.1.0.jar。将jar版本更新为与meReferring的服务器版本相同的ES 2.4 docs(),在我看来,“client.transport.sniff”默认值已禁用-超时5s。因此,这里唯一实际的修改是
集群名称
忽略集群名称
。我相信此配置不会对原始问题产生任何影响(正面或负面)
NoNodeAvailableException
@Beccari您是对的。我测试代码,即使我注释掉了
spring.data.elasticsearch.properties
,我的代码仍然有效。使用属性的elasticsearch源代码是。我犯了一个与Dan Barzilay相同的错误:将“client.transport.sniff”设置为true,然后获得了
NoNodeAvailableException
。这与原来的问题不同。但也许是对其他人的提醒。谢谢!我的yml文件中有错误的配置。network.host:属性设置为0.0.0.0。将其更改为127.0.0.1非常有效
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
$ /Users/kkolipaka/elasticsearch/bin/elasticsearch -version
Version: 5.2.2, Build: f9d9b74/2017-02-24T17:26:45.835Z, JVM: 1.8.0_111