web-dev-qa-db-ja.com

Java ElasticSearch設定されたノードはどれも使用できません

過去1時間でelasticsearch 1.3.2をダウンロードしてインストールしたところ

ポート9200および9300:9400にIPテーブルを開きました

/ etc/hostsにコンピューター名とIPを設定します

ヘッドモジュールと救急救命士がインストールされ、スムーズに動作します

localhostのcurlは完璧に動作します

ダウンロードからすべてのjarをEclipseにコピーしたため、同じバージョンのクライアント

-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();
        }
}

-出力-

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)

更新:今、私は本当に混乱しています。 Eclipseでrunを3回押しました。上記のエラーを2回受け取りました。 1回検索が機能しました!??真新しいCentos 6.5 vps、真新しいjdkがインストールされています。次にelasticsearchをインストールしましたが、他には何もしていません。

更新:./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

-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

Elasticsearchの設定は$ES_HOME/config/elasticsearch.ymlにあります。そこで、cluster.name設定がコメント化されている場合、ESがほぼすべてのクラスター名を取ることを意味します。したがって、コードでは、cluster.name as "elastictest"が問題になる可能性があります。これを試して:

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

考えられる問題:

  1. 間違ったポート。JavaまたはScalaクライアントを使用する場合、正しいポートは9300ではなく9200です
  2. 間違ったクラスター名、コードで設定したクラスター名が$ES_HOME/config/elasticsearch.ymlで設定したcluster.nameと同じであることを確認してください
  3. スニッフオプション、client.transport.snifftrueに設定しますが、ESクラスターのすべてのノードに接続できない場合もこの問題が発生します。 ES doc here 理由の説明。
34
backingwu

ノードのポートを確認する必要があります。headを使用して実行できます。これらのポートは同じではありません。例、

開くことができるWeb URLはlocalhost:9200ですが、ノードのポートは9300であるため、9200をポートとして使用する場合、構成済みのノードはどれも使用できません。

14
fmyblack

同様の問題に直面し、ここに解決策があります

例:

  1. Elasticsearch.ymlで以下のプロパティを追加します

    cluster.name: production
    node.name: node1
    network.bind_Host: 10.0.1.22
    network.Host: 0.0.0.0
    transport.tcp.port: 9300
    
  2. 一括プッシュ用のJava Elastic APIに以下を追加します(コードスニペットのみ)。 IPアドレスには、エラスティック検索マシンのパブリックIPアドレスを追加します

    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. 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}]]

私の場合、バージョンの違いでした。 elasticsearchクラスターのログを確認すると、表示されます。

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]

Elasticsearchクライアントとトランスポートバージョン5.1.1を使用していました。そして、私のelasticsearchクラスターバージョンは6だったので、ライブラリバージョンを5.4.3に変更します。

4
Dushmantha

上記のアドバイスが役に立たない場合は、ロギングフレームワーク構成(log4j、logback ...)のlog levelINFOに変更します。次に、出力を再確認します。

ロガーは次のようなメッセージを隠している可能性があります。

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

(上記の例では、ElasticSearchに認証が必要なX-Packプラグインがありました)

3
Dimitar II

完了のために、InetSocketTransportAddressが提供する適切な静的メソッドを使用してトランスポートクライアントを作成するスニペットを以下に示します。

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

この問題が発生している他のユーザー向け。

Spring Boot <2バージョンの実行中に新しいElasticSearch(5.5以降)を実行している場合、このエラーが発生することがあります。

RESTクライアントは廃止されるため、Javaクライアントを使用することをお勧めします。

他の回避策は、Spring Boot 2にアップグレードすることです。これは互換性があるはずです。

詳細については、 https://discuss.elastic.co/t/spring-data-elasticsearch-cant-connect-with-elasticsearch-5-5-0/94235 を参照してください。

2
nesohc

この問題を理解するために私は数日一緒に過ごします。私はその遅れを知っていますが、これは役に立つかもしれません:

以下の互換/安定バージョンを変更することにより、この問題を解決しました。

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

メイヴン:

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

Elasticバージョンについて言及する必要はありません。デフォルトでは6.4.0です。ただし、特定のバージョンを追加する場合。以下のスニペットをプロパティタグ内で使用し、Spring BootとSpring Dataの互換バージョンを使用します(必要な場合)

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

また、ElasticConfigurationでRest High Levelクライアントを使用しました:

@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;
    }
}

重要な注意:Elasticは9300ポートを使用して、ノードと9200の間のHTTPクライアントとして通信します。アプリケーションのプロパティ:

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)

Postmanから、次を使用できます。 http://10.40.43.111:9200/ [indexname]/_search

ハッピーコーディング:)

1
Sdembla

ほとんどの回答は時代遅れに見えるので、ここで私のために働いた設定があります:

  • Elasticsearch-Version:7.2.0(OSS)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

セットアップ:

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

PreBuiltTransportClientは推奨されないため、Elasticsearch-Version 7.3.0にはRestHighLevelClientを使用する必要があります。 https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/7.3。 0/index.html

1
Douy789

Elasticsearch.ymlを確認してください。「transport.Host」プロパティは「127.0.0.1」または「localhost」ではなく「0.0.0.0」でなければなりません

0
Romain DEQUIDT

これは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

つまり、ES transportClientをインスタンス化してこの例外をスローすることはできません。この問題を引き起こす可能性がいくつかあります。

  • クラスター名が正しくありません。 ES_HOME_DIR/config/elasticserach.ymlファイルを開き、クラスター名の値を確認してくださいORこのコマンドを使用してください:curl -XGET 'http://localhost:9200/_nodes'
  • ポート9200がhttpポートであるが、elasticsearchサービスがtcpポート9300を使用していることを確認します[デフォルト]。そのため、ポートがブロックされていないことを確認してください。
  • 認証の問題:認証のためにtransportClientのコンテキストにヘッダーを設定します。

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

それでもこの問題に直面している場合は、次のプロパティを追加します。

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

以下の基本的なコードは私のためにうまく機能しています:

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

Java Transport clientを使用している場合1.check 9300はアクセス可能/ openです。 2.ノードとクラスタ名を確認します。これは正しいはずです。ブラウザでip:portと入力して、ノードとクラスタ名を確認できます。 3.jarのバージョンとEsがインストールされているバージョンを確認します。

0
prasad kp