[英]MasterNotDiscoveredException - connecting to elasticsearch running on machine with dyanamic ip using NodeClient
[英]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類作為參數傳遞而沒有成功。
使用NodeClient啟動嵌入式ElasticSearch以及將TransportClient與添加的ReindexPlugin一起使用均無效。 我得到的只是一個異常: ActionNotFoundTransportException[No handler for action [indices:data/write/reindex]]
感興趣的依存關系:
啟動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);
觸發重新索引的主要部分:
ReindexRequestBuilder builder = ReindexAction.INSTANCE.newRequestBuilder(getClient())
.source(indexFrom)
.destination(indexTo)
.refresh(true);
通過結合上述兩種方法,我能夠解決此問題。
因此,創建NodeClient涉及覆蓋Node:
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的支持程度很差。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.