2013-12-16 2 views
1

Учитывая приложение, использующее JavaAPI TransportClient от ElasticSearch, я хочу использовать собственный файл конфигурации elasticsearch.yml (разрешенный InternalSettingsPreparer) в пути класса для подключения к кластеру через транспорт.ElasticSearch Java API TransportClient адрес в файле конфигурации

На данный момент у меня есть следующее содержание:

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(); client.admin(). Cluster(). PrepareState(). Execute(). ActionGet(); // конфиг/elastisearch.yml cluster.name: elasticsearch network.host: локальный network.transport.tcp.port: 9300-9400 еще не дает "Нет узла доступного" исключение P.S. es-0.90.7 –

3

Короткий ответ, нет , Elasticsearch не имеет способа настроить набор сетевых адресов по умолчанию для соединения при использовании транспортного клиента.

Однако довольно просто добавить поддержку для этого, сохраняя при этом загрузку конфигурации по умолчанию и т. Д., Добавив ее в любом месте, которое вам нужно в конфигурации. Например, в elasticsearch.yml:

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

может быть загружен следующий код, который включает в себя некоторые дополнительные разборе для дополнительного номера порта:

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

, что привело in: org.elasticsearch.client.transport.NoNodeAvailableException: нет доступных узлов

В журналах я нашел: bound_address {инет [/ 0: 0: 0: 0: 0: 0: 0: 0: 9210]}, {publish_address инет [/172.00.71.128:9200]}

Но я получил исключение [transport.netty] [Sabra], пойманное на транспортном уровне [[id: 0x0fd1380f, /127.0.0.1:53090 => /127.0.0.1:9300]], закрывающее соединение java.io.IOException: Eine vorhandene Verbindung Würde фом RemoteHOST geschlossen

После поиска исправления к этому довольно долго сам я, наконец, нашел, что это работает для меня:

Когда вы звоните http://localhost:9200/_cluster/state я заметил, что только мой локальный IP-адрес был а не loopback локального хоста.

Изменение моей конфигурации TransportAddress к

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

, наконец, решить мою проблему. Надеюсь, что это помогает

Смежные вопросы