Почему Hibernate MassIndexer говорит, что индексация завершена, но на самом деле она не завершена - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь индексировать большие данные (13,5 млн. Записей с привязкой к 7-8 таблицам) в упругом поиске с использованием MassIndexer. Он показал сообщение, что он проиндексировал все записи после 39,08%. У меня одна и та же проблема в локальном и производственном процессах, процент варьируется для каждого выполнения.

fullTextEntityManager
                .createIndexer(XYZ.class)
                .batchSizeToLoadObjects(500).cacheMode(CacheMode.IGNORE).threadsToLoadObjects(2).idFetchSize(Integer.MIN_VALUE)
                .startAndWait();

Вход:

23:05:25,338 (Hibernate Search: Elasticsearch transport thread-2)  INFO SimpleIndexingProgressMonitor:90 - HSEARCH000031: Indexing speed: 1085.105591 documents/second; progress: 39.08%
23:05:25,339 (Hibernate Search: Elasticsearch transport thread-2)  INFO SimpleIndexingProgressMonitor:87 - HSEARCH000030: 5322450 documents indexed in 4904960 ms
23:05:25,339 (Hibernate Search: Elasticsearch transport thread-2)  INFO SimpleIndexingProgressMonitor:90 - HSEARCH000031: Indexing speed: 1085.115845 documents/second; progress: 39.08%
23:05:25,339 (Hibernate Search: Elasticsearch transport thread-2)  INFO SimpleIndexingProgressMonitor:87 - HSEARCH000030: 5322500 documents indexed in 4904961 ms
23:05:25,339 (Hibernate Search: Elasticsearch transport thread-2)  INFO SimpleIndexingProgressMonitor:90 - HSEARCH000031: Indexing speed: 1085.125854 documents/second; progress: 39.08%
23:05:36,103 (Hibernate Search: Elasticsearch transport thread-3) DEBUG request:194 - HSEARCH400082: Executed Elasticsearch HTTP POST request to path '/xyz/_forcemerge' with query parameters {} in 16734ms. Response had status 200 'OK'.
23:05:37,666 (Hibernate Search: Elasticsearch transport thread-3) DEBUG request:194 - HSEARCH400082: Executed Elasticsearch HTTP POST request to path '/xyz/_flush' with query parameters {} in 1562ms. Response had status 200 'OK'.
23:05:37,668 (Hibernate Search: Elasticsearch transport thread-3) DEBUG request:194 - HSEARCH400082: Executed Elasticsearch HTTP POST request to path '/xyz/_refresh' with query parameters {} in 1ms. Response had status 200 'OK'.
23:05:37,668 (main)  INFO SimpleIndexingProgressMonitor:78 - HSEARCH000028: Reindexed 13618954 entities

Он должен показывать, что индексирование завершено только после индексации всех записей.

Ответы [ 2 ]

1 голос
/ 15 июля 2019

Ваш журнал ясно показывает, что во время массовой индексации есть ошибки, которые не упоминались в вашем первоначальном сообщении.

Вы периодически получаете ошибки, подобные этой:

10:48:28,125 (Hibernate Search: Elasticsearch transport thread-2) ERROR LogErrorHandler:71 - HSEARCH000058: Exception occurred org.hibernate.search.exception.SearchException: HSEARCH400007: Elasticsearch request failed.
Request: POST /_bulk with parameters {refresh=false}
Response: null
Subsequent failures:
    Entity com.example.model.XXXXXX  Id 855665929073643520  Work Type  org.hibernate.search.backend.AddLuceneWork

org.hibernate.search.exception.SearchException: HSEARCH400007: Elasticsearch request failed.
Request: POST /_bulk with parameters {refresh=false}
Response: null
    at org.hibernate.search.elasticsearch.work.impl.BulkWork.lambda$execute$1(BulkWork.java:77)
    at org.hibernate.search.util.impl.Futures.lambda$handler$1(Futures.java:57)
    at java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:870)
    at java.util.concurrent.CompletableFuture$UniExceptionally.tryFire(CompletableFuture.java:852)
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
    at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977)
    at org.hibernate.search.elasticsearch.client.impl.DefaultElasticsearchClient$1.onFailure(DefaultElasticsearchClient.java:123)
    at org.elasticsearch.client.RestClient$FailureTrackingResponseListener.onDefinitiveFailure(RestClient.java:605)
    at org.elasticsearch.client.RestClient$1.retryIfPossible(RestClient.java:396)
    at org.elasticsearch.client.RestClient$1.failed(RestClient.java:375)
    at org.apache.http.concurrent.BasicFuture.failed(BasicFuture.java:134)
    at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.failed(AbstractClientExchangeHandler.java:419)
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:375)
    at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:92)
    at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:39)
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:175)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:263)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:492)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:213)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:280)
    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)
Caused by: java.net.SocketTimeoutException
    ... 11 more

Хотя по сути это означает, что некоторые запросы на индексирование не были выполнены из-за того, что Elasticsearch слишком долго не отвечал.

Может быть много причин.

Ваша конфигурация поиска Hibernate выглядит очень консервативно (всего два потока), поэтому я не думаю, что вы слишком сильно напрягаете свой кластер Elasticsearch.

Я бы посоветовал дважды проверить настройки Elasticsearch (документация Elasticsearch, вероятно, предоставляет некоторые преимущества и недостатки, которые могут помочь). Убедитесь, что у вас есть кластер Elasticsearch соответствующего размера, что серверы имеют соответствующие размеры, ...

Возможно, вы также захотите настроить свойства конфигурации hibernate.search, связанные с взаимодействием с кластером Elasticsearch: время ожидания, количество соединений, ... См. https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#elasticsearch-integration-configuration

0 голосов
/ 20 июня 2019

Это очень похоже на HSEARCH-3462 , который был исправлен в 6.0.0.Alpha2, но не перенесен на 5.11.

Короче говоря: проблема с журналированием,не проблема индексации.Последняя строка, в которой говорится, что все было переиндексировано, - это та, в которую вы должны верить.

Я посмотрю, сможем ли мы легко перенести исправление в 5.10 / 5.11, но может пройти некоторое время, пока мы снова не выпустим эти ветви.Обратный билет (если вам нужно отслеживать прогресс): https://hibernate.atlassian.net/browse/HSEARCH-3622

...