2016-06-14 5 views
0

С отменой SearchTye.SCAN и новым Reindex API мы хотим перенести наш кластер и клиенты elasticsearch с 2.1.1 до 2.3.3.Reindex elasticsearch 2.3.3 при использовании Java NodeClient

Мы используем java и соответствующие библиотеки для доступа к elasticsearch. Для доступа к кластеру мы используем TransportClient, для встроенных Unittests мы используем NodeClient.

К сожалению, Reindex API предоставлен в виде плагина, с которым NodeClient, похоже, не справляется.

Итак, вопрос в том, как использовать NodeClient с Reindex-Plugin?

Я уже пробовал разоблачить защищенный конструктор NodeClient, чтобы передать класс ReindexPlugin в качестве аргумента без успеха.

Использование NodeClient для запуска встроенного ElasticSearch и использования TransportClient с добавленным ReindexPlugin также не работало. Все я здесь есть исключение: ActionNotFoundTransportException[No handler for action [indices:data/write/reindex]]

Зависимости интереса:

  • org.elasticsearch: elasticsearch: 2.3.3
  • org.elasticsearch.module: переиндексации: 2.3.3
  • орг .apache.lucene: Lucene-выражения: 5.5.1
  • org.codehaus.groovy: заводной: 2.4.6

Запуск NodeClient:

Settings.Builder settings = Settings.settingsBuilder(); 
settings.put("path.data", "/some/path/data"); 
settings.put("path.home", "/some/path/home"); 
//settings.put("plugin.types", ReindexPlugin.class.getName()); > No effect 
settings.put("http.port", 9299); 
settings.put("transport.tcp.port", 9399); 

node = NodeBuilder.nodeBuilder() 
    .clusterName("testcluster") 
    .settings(settings) 
    .local(true) 
    .node(); 

// also tested with local(false), then no transport port is available, resulting in NoNodeAvailableException 

Использование TransportClient для доступа к Node:

Settings settings = Settings.settingsBuilder() 
    .put("cluster.name", "testcluster") 
    .put("discovery.zen.ping.multicast.enabled", false) 
    .build(); 
InetSocketTransportAddress[] addresses = new InetSocketTransportAddress[] 
    {new InetSocketTransportAddress(new InetSocketAddress("localhost", 9399))}; 
client = TransportClient.builder() 
    .settings(settings) 
    .addPlugin(ReindexPlugin.class) 
    .build() 
    .addTransportAddresses(addresses); 

Основная часть инициирующего REINDEX:

ReindexRequestBuilder builder = ReindexAction.INSTANCE.newRequestBuilder(getClient()) 
    .source(indexFrom) 
    .destination(indexTo) 
    .refresh(true); 

ответ

0

Я был в состоянии решить эту проблему, путем сочетания обоих подходов, описанных выше.

Так создавая NodeClient включает переопределение Узел:

class ExposedNode extends Node { 
    public ExposedNode(Environment tmpEnv, Version version, Collection<Class<? extends Plugin>> classpathPlugins) { 
     super(tmpEnv, version, classpathPlugins); 
    } 
} 

И использовать его при запуске NodeClient:

Settings.Builder settings = Settings.settingsBuilder(); 
settings.put("path.data", "/some/path/data"); 
settings.put("path.home", "/some/path/home"); 
settings.put("http.port", 9299); 
settings.put("transport.tcp.port", 9399); 

// Construct Node without NodeBuilder 
List<Class<? extends Plugin>> classpathPlugins = ImmutableList.of(ReindexPlugin.class); 
settings.put("node.local", false); 
settings.put("cluster.name", "testcluster"); 
Settings preparedSettings = settings.build(); 
node = new ExposedNode(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), Version.CURRENT, classpathPlugins); 
node.start(); 

После этого вы можете использовать TransportClient который добавляет ReindexPlugin, как описано в вопрос.

Тем не менее это грязный хак, который может сломаться в будущем выпуске, и показывает, как плохо Elasticsearch поддерживает разработку плагинов imo.

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

  • Нет связанных вопросов^_^