我正在运行一些流作业,这些作业写入ES 6.8.2集群,并且希望能够每隔几个小时翻转索引,这是因为数据量非常大并且需要短期数据。我真正想做的一件事是在作业开始时在一个请求中设置索引,别名和过渡。 ES Java客户端的文档使我相信这是可能的(请参阅https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-high-rollover-index.html#CO375-1和https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-high-rollover-index.html#CO377-1)。但是,我的尝试导致响应400,并显示消息“源别名不存在”。
这里有我编写的用于在作业启动时准备过渡索引的代码的片段:
// Prepare indices
private void indexInit() throws RuntimeException {
RestHighLevelClient client = new RestHighLevelClient(this.restClientBuilder);
GetAliasesRequest requestWithAlias = new GetAliasesRequest(this.jobName);
try {
boolean exists = client.indices().existsAlias(requestWithAlias, RequestOptions.DEFAULT);
if (!exists) {
ObjectMapper objectMapper = new ObjectMapper();
InputStream stream = getClass().getClassLoader().getResourceAsStream(this.jobName + ".json");
Map<String,Object> indexMapping = objectMapper.readValue(stream, new TypeReference<Map<String,Object>>(){});
RolloverRequest request = new RolloverRequest(this.jobName, null)
.addMaxIndexAgeCondition(TimeValue.timeValueHours(this.rolloverInterval));
request.getCreateIndexRequest().mapping(indexMapping);
request.getCreateIndexRequest().alias(new Alias(this.jobName));
client.indices().rollover(request, RequestOptions.DEFAULT);
}
client.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
这是该异常的完整描述和堆栈跟踪:
org.elasticsearch.client.ResponseException: method [POST], host [http://redacted.svc.32.redacted.io:9200], URI [/redacted/_rollover?master_timeout=30s&include_type_name=false&timeout=30s], status line [HTTP/1.1 400 Bad Request]
{"error":{"root_cause":[{"type":"remote_transport_exception","reason":"[redacted-0][xxx.xxx.xxx.xxx:9300][indices:admin/rollover]"}],"type":"illegal_argument_exception","reason":"source alias does not exist"},"status":400}
at org.elasticsearch.client.RestClient$1.completed(RestClient.java:552)
at org.elasticsearch.client.RestClient$1.completed(RestClient.java:537)
at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:123)
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:177)
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:436)
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:326)
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
at java.lang.Thread.run(Thread.java:748)
我甚至想做些什么,如果可以的话,我该怎么做呢?我以为request.getCreateIndexRequest().alias(new Alias(jobName));
行可以处理使用新索引创建别名的情况。