2013-12-16 65 views
1

由于应用程序使用ElasticSearch的JavaAPI传输客户端,因此我希望在类路径中使用本地elasticsearch.yml(由InternalSettingsPreparer解析)配置文件以通过传输连接到群集。配置文件中的ElasticSearch Java API传输客户端地址

现在我有以下内容:

cluster: 
    name: elasticsearch # would be ${es.cluster.name} 

network: 
    host: localhost 
    transport_address: localhost:9301 # would be ${es.network.trasport} 

和客户端的初始化:

TransportClient client = new TransportClient(); 

这使我异常:

13/12/16 14:04:40 INFO elasticsearch.plugins: [Hanna Levy] loaded [], sites [] 
org.elasticsearch.client.transport.NoNodeAvailableException: No node available 

但是当我添加以下line

client.addTransportAddress(new InetSocketTransportAddress("localhost", 9301)); 

事情开始按预期工作。

所以我想知道,是否有一种方法来配置标准配置文件格式的传输地址,而不是通过配置文件的配置文件重新发明轮子?

回答

4

使用transport.tcp.port应该如下所示:

cluster: 
    name: elasticsearch # would be ${es.cluster.name} 

network: 
    host: localhost 
    transport: 
    tcp: 
     port: 9301 # would be ${es.network.transport.tcp.port} 

而且,我通常使用以下格式我elasticsearch.yml文件

cluster.name=elasticsearch 
network.host=localhost 
network.transport.tcp.port=9301 
+0

不起作用依然:org.elasticsearch.client.transport.NoNodeAvailableException:没有可用的节点 \t在org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:212) –

+0

我测试了这个本地和有类似的错误,直到我修改端口为一个范围:9300-9400我检查了文档和端口设置应该是一个范围 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/ current/modules-transport.html它默认为9300-9400,这对您应该足够了。因此,您可以将9300-9400的值或删除它,因为您已经使用了默认值。 –

+0

仍然没有成功: // java代码: TransportClient client = new TransportClient(); ();(); prepareState()。execute()。actionGet(); //配置/ elastisearch.yml cluster.name:elasticsearch network.host:本地主机 network.transport.tcp.port:9300-9400 仍然给出 “无可用节点” 异常 附: es-0.90.7 –

3

简短的回答是,没有,Elasticsearch没有办法在使用传输客户端时配置默认的网络地址集来加入。

但是,添加对此的支持相当简单,同时仍然通过将其添加到配置中的任何位置来搭载默认配置加载等。例如,在elasticsearch.yml

import org.elasticsearch.client.transport.TransportClient; 
import org.elasticsearch.common.transport.InetSocketTransportAddress; 

public class Test { 
    public static void main(String[] args) { 
     TransportClient client = new TransportClient(); 

     for(String host: client.settings().getAsArray("transport.client.initial_nodes")) { 
      int port = 9300; 

      // or parse it from the host string... 
      String[] splitHost = host.split(":", 2); 
      if(splitHost.length == 2) { 
       host = splitHost[0]; 
       port = Integer.parseInt(splitHost[1]); 
      } 

      client.addTransportAddress(new InetSocketTransportAddress(host, port)); 
     } 

     // ... 
    } 
} 
4

我总称为

Settings settings = ImmutableSettings.settingsBuilder() 
       .put("cluster.name", "mycluster") 
       .put("client.transport.sniff", true).build(); 

     // now try to connect with the TransportClient 
     Client client = new TransportClient(settings) 
       .addTransportAddress(new InetSocketTransportAddress(
         "localhost", httpPort)); 

这导致:

transport.client.initial_nodes: ["localhost:9301"] 

可以通过下面的代码,其包括用于可选的端口号一些额外的解析装in: org.elasticsearch.client.transport.NoNodeAvailableException:无节点可用

在日志我发现: bound_address {INET [/ 0:0:0:0:0:0:0:0:9210]},{publish_address INET [/172.00.71.128:9200]}

但是,我在传输层[[id:0x0fd1380f,/127.0.0.1:53090 => /127.0.0.1:9300]]上捕获了[transport.netty] [Sabra]异常,并关闭了连接 java.io.IOException异常:EINE vorhandene Verbindung wurde VOM REMOTEHOST geschlossen

寻找一个修复这个相当长的时间自己后,我终于找到了这个工作对我来说:

当你调用http://localhost:9200/_cluster/state我注意到,只有我的本地IP地址是绑定,而不是本地主机回送。

更改我的TransportAddress配置

InetAddress IP = InetAddress.getLocalHost(); 
client = new TransportClient(settings) 
    .addTransportAddress(new InetSocketTransportAddress(IP.getHostAddress(), 9300)); 

终于解决了我的问题。希望这有助于

相关问题