使用 Java NodeClient 时重新索引 elasticsearch 2.3.3
Reindex elasticsearch 2.3.3 when using Java NodeClient
随着 SearchTye.SCAN
和新 Reindex API 的弃用,我们希望将我们的 elasticsearch 集群和客户端从 2.1.1 迁移到 2.3.3。
我们使用 java 和适当的库来访问 elasticsearch。要访问集群,我们使用 TransportClient,对于嵌入式单元测试,我们使用 NodeClient。
不幸的是,Reindex API 作为插件提供,NodeClient 似乎无法处理。
所以问题是如何将 NodeClient 与 Reindex-Plugin 一起使用?
我已经尝试公开受保护的 NodeClient 构造函数以将 ReindexPlugin class 作为参数传递,但没有成功。
使用 NodeClient 启动嵌入式 ElasticSearch 和使用添加了 ReindexPlugin 的 TransportClient 也不起作用。我得到的只是一个例外:ActionNotFoundTransportException[No handler for action [indices:data/write/reindex]]
感兴趣的依赖关系:
- org.elasticsearch:elasticsearch:2.3.3
- org.elasticsearch.module:reindex:2.3.3
- org.apache.lucene:lucene-expressions:5.5.1
- org.codehaus.groovy: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 访问节点:
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);
我通过结合上述两种方法解决了这个问题。
因此创建 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();
之后您可以使用添加 ReindexPlugin 的 TransportClient,如问题中所述。
尽管如此,这是一个肮脏的 hack,可能会在未来的版本中崩溃,并表明 Elasticsearch 在我看来对插件开发的支持有多么糟糕。
随着 SearchTye.SCAN
和新 Reindex API 的弃用,我们希望将我们的 elasticsearch 集群和客户端从 2.1.1 迁移到 2.3.3。
我们使用 java 和适当的库来访问 elasticsearch。要访问集群,我们使用 TransportClient,对于嵌入式单元测试,我们使用 NodeClient。
不幸的是,Reindex API 作为插件提供,NodeClient 似乎无法处理。
所以问题是如何将 NodeClient 与 Reindex-Plugin 一起使用?
我已经尝试公开受保护的 NodeClient 构造函数以将 ReindexPlugin class 作为参数传递,但没有成功。
使用 NodeClient 启动嵌入式 ElasticSearch 和使用添加了 ReindexPlugin 的 TransportClient 也不起作用。我得到的只是一个例外:ActionNotFoundTransportException[No handler for action [indices:data/write/reindex]]
感兴趣的依赖关系:
- org.elasticsearch:elasticsearch:2.3.3
- org.elasticsearch.module:reindex:2.3.3
- org.apache.lucene:lucene-expressions:5.5.1
- org.codehaus.groovy: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 访问节点:
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);
我通过结合上述两种方法解决了这个问题。
因此创建 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();
之后您可以使用添加 ReindexPlugin 的 TransportClient,如问题中所述。
尽管如此,这是一个肮脏的 hack,可能会在未来的版本中崩溃,并表明 Elasticsearch 在我看来对插件开发的支持有多么糟糕。