Эластичный поиск не может написать все записи: может быть, ES был перегружен

У меня есть приложение, в котором я читаю CSV-файлы и делаю некоторые преобразования, а затем помещаю их в упругий поиск из самой искры. Как это

input.write.format("org.elasticsearch.spark.sql")
              .mode(SaveMode.Append)
              .option("es.resource", "{date}/" + type).save()

У меня есть несколько узлов, и в каждом узле я бегу 5-6 spark-submit Команды, которые подталкивают к elasticsearch

Я часто получаю ошибки

Could not write all entries [13/128] (Maybe ES was overloaded?). Error sample (first [5] error messages):
        rejected execution of org.elasticsearch.transport.TransportService$7@32e6f8f8 on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@4448a084[Running, pool size = 4, active threads = 4, queued tasks = 200, completed tasks = 451515]]

Мой кластер Elasticsearch имеет следующую статистику -

Nodes - 9 (1TB space,
Ram >= 15GB ) More than 8 cores per node

Я изменил следующие параметры для эластичного поиска

spark.es.batch.size.bytes=5000000
spark.es.batch.size.entries=5000
spark.es.batch.write.refresh=false

Кто-нибудь может подсказать, что я могу исправить, чтобы избавиться от этих ошибок?

2 ответа

Решение

Это происходит из-за того, что массовые запросы поступают со скоростью, превышающей скорость обработки кластера эластичного поиска, и очередь массовых запросов заполнена.

Размер очереди по умолчанию составляет 200.

В идеале вы должны обработать это на стороне клиента:

1) путем уменьшения количества одновременных команд spark-submit

2) Повторите попытку в случае отклонения, настроив es.batch.write.retry.count а также es.batch.write.retry.wait

Пример: es.batch.write.retry.wait = 6 es.batch.write.retry.count = "60s"

На стороне кластера эластичного поиска:

1) проверьте, не слишком ли много осколков в индексе, и попробуйте уменьшить его.
В этом блоге есть хорошее обсуждение критериев настройки количества шардов.

2) в крайнем случае увеличьте thread_pool.index.bulk.queue_size

Проверьте этот блог с обширным обсуждением массовых отклонений.

Объемная очередь в вашем кластере ES достигает своей емкости (200) . Попробуйте увеличить его. Смотрите эту страницу, чтобы узнать, как изменить объем очереди.

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html

Также проверьте этот другой ответ SO, где OP имела очень похожую проблему и была исправлена ​​путем увеличения размера пула.

Отклонено Выполнение org.elasticsearch.transport.TransportService Ошибка

Другие вопросы по тегам