Как читать из ES 1.7 огромных данных для индексации в ES 6.7 - PullRequest
1 голос
/ 08 мая 2019

Необходимо прочитать данные из ES 1.7 для индексации до 6.7.Поскольку нет доступных обновлений.Необходимо проиндексировать почти 5 ТБ данных на 200 миллионов записей.Мы используем ES_REST_high_level_client (6.7.2), используя подход поиска и прокрутки.но не в состоянии прокрутить, используя идентификатор прокрутки.и другой подход попробовал использовать от и размер партии.Первоначально чтение происходит быстрее, так как увеличение со смещением действительно плохо.Что лучше всего сделать.

1-й подход с использованием поиска и прокрутки.

            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.size(10);
            searchRequest.source(searchSourceBuilder);
            searchRequest.scroll(TimeValue.timeValueMinutes(2));
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            String scrollId = searchResponse.getScrollId();

    while (run) {
                SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
                scrollRequest.scroll(TimeValue.timeValueSeconds(60));
                SearchResponse searchScrollResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
                scrollId = searchScrollResponse.getScrollId();
                hits = searchScrollResponse.getHits();

                if (hits.getHits().length == 0) {
                    run = false;
                }
            }

Исключение Исключение в потоке "main" ElasticsearchStatusException [Исключение Elasticsearch [тип = исключение, причина = ElasticsearchIllegalArgumentException [Не удалось декодировать scrollId];nested: IOException [Неверный ввод Base64 десятичного знака 123 в позиции массива 0];]] в org.elasticsearch.rest.BytesRestResponse.errorFromXContent (BytesRestResponse.java:177) в org.elasticsearch.client.RestHighLevelClient.parseEntity (RestHighLevelClient.javalevel.lip.: 2026):

2-й подход:

int offset = 0;
        boolean run = true;
        while (run) {
            SearchRequest searchRequest = new SearchRequest("indexname");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.from(offset);
            searchSourceBuilder.size(500);
            searchRequest.source(searchSourceBuilder);
            long start = System.currentTimeMillis();
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            long end = System.currentTimeMillis();

            SearchHits hits = searchResponse.getHits();
            System.out.println(" Total hits : " + hits.totalHits + " time : " + (end - start));
            offset += 500;
            if(hits.getHits().length == 0) {
                run = false;
            }
        }

Любой другой подход для чтения данных.

1 Ответ

0 голосов
/ 09 мая 2019

Как правило, лучшим решением будет удаленный переиндекс: https://www.elastic.co/guide/en/elasticsearch/reference/6.7/docs-reindex.html#reindex-from-remote

Я не уверен, что клиенты REST по-прежнему совместимы с 1.x, хотя удаленный переиндекс должен его поддерживать.

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

...