Эластичный поиск не может написать все записи: может быть, 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 Ошибка