Создайте индекс, псевдоним и настройте Rollover в одном запросе [Elasticsearch Java API] - PullRequest
0 голосов
/ 01 ноября 2019

Я выполняю некоторые потоковые задания, которые пишут в кластер ES 6.8.2 и хотят иметь возможность сменять индексы каждые несколько часов из-за очень большого объема данных и краткосрочной потребности в них. Одна вещь, которую я действительно хотел бы сделать, это настроить индекс, псевдоним и ролловер в одном запросе при запуске задания. Документация по Java-клиенту ES привела меня к мысли, что это возможно (см. 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)); будет обрабатывать создание псевдонима с новым индексом.

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