web-dev-qa-db-ja.com

ElasticSearch Java API:NoNodeAvailableException:利用可能なノードがありません

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/

これを取れ

{
    "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"
}

Java APIを使用してエラーが発生するのはなぜですか?

[〜#〜] edit [〜#〜]

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
22
Joe

いくつかの提案:

1-ポート9300を使用します。[9300-9400]はノード間通信用、[9200-9300]はHTTPトラフィック用です。

2-使用しているJava APIのバージョンが、サーバーで実行されているelasticsearchのバージョンと一致することを確認します。

3-クラスターの名前がfoxzenであることを確認します(サーバー上のelasticsearch.ymlを確認します)。

4-put("node.name", "yu")を削除します。TransportClientを使用しているため、クラスターとしてノードに参加していません。サーバーノードの名前がyuであるように見えてもいずれにしても、異なるノード名が必要になります。

33
hudsonb

ポート9300を使用するには、コードを変更する必要があります。正しい行は次のとおりです。

 Client client = new TransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress("XXX.XXX.XXX.XXX", 9300));

理由は、Java APIはノード間通信に使用される内部トランスポートを使用しており、デフォルトはポート9300であるためです。ポート9200はREST APIインターフェース:よくある問題-トランスポートクライアントの下のページの下部にあるこのサンプルコードを確認してください。

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
John Petrone

私もこのエラーに遭遇しました。私は、DockerでElasticSearch 2.4.1をスタンドアロンサーバー(単一ノード)として使用し、Grails 3/spring-data-elasticsearchでプログラミングします。私の修正はclient.transport.sniffからfalseへ。ここに私のコアconfがあります:

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

this を参照してください

3
btpka3

ESサーバーをリモートホストに設定していると思いますか?その場合、公開アドレスをホストのパブリックIPアドレスにバインドする必要があります。

ESホストで/etc/elasticsearch/elasticsearch.ymlおよびnetwork.publish_Hostの後にパブリックIPを追加します。

# 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

そして、コードでポート9300でこのホストに接続します。ドメイン名ではなくIPが必要であることに注意してください(少なくともAmazon EC2での私の経験によると)

1
Amit Goldstein

ポート9300を使用している場合でも問題が解決せず、他のすべてが正しく構成されているようであれば、古いバージョンのelasticsearchを使用してみてください。

Elasticsearchバージョン2.2.0を使用しているときに同じエラーが発生していましたが、バージョン1.7.5にロールバックするとすぐに、私の問題は魔法のように消えました。この問題を抱えている他の人へのリンクは次のとおりです。 古いバージョンが問題を解決します

0
rrudland

他の理由として、Elasticsearch Java clientElasticsearchサーバーとは異なるバージョンです。

Elasticsearch Javaクライアントバージョンは、コードベースのelasticsearchjarバージョンに他なりません。

例:私のコードではelasticsearch-2.4.0.jar

Elasticsearchサーバーのバージョンを確認するには、

$ /Users/kkolipaka/elasticsearch/bin/elasticsearch -version
Version: 5.2.2, Build: f9d9b74/2017-02-24T17:26:45.835Z, JVM: 1.8.0_111

ご覧のとおり、Elastic server 5.2.2の最新バージョンをダウンロードしましたが、ES Java APIクライアントバージョン2.4.0 https://www.elastic .co/guide/en/elasticsearch/client/Java-api/current/client.html

0
Kondal Kolipaka

TransportClientビルダーでcluster.nameを設定していなかったため、同様の問題を抱えている人のためにこれを受け取りました。プロパティを追加し、すべてが機能しました。

0
Joseph Lust

別の解決策は、プロジェクトの依存関係に_io.netty.netty-all_を明示的に含めることです。

addTransportAddressesでメソッドnodesSampler.sample()が実行され、追加されたアドレスの可用性が確認されています。私の場合、メソッドio.netty.channel.DefaultChannelId.newInstance()が見つからないため、_try-catch_ブロックはConnectTransportExceptionを飲み込みます。したがって、追加されたノードは使用可能として扱われません。

0
N. Kudryavtsev