Подтвердить что ты не робот

ElasticSearch дает ошибку о размере очереди

RemoteTransportException [[Смерть] [инет [/172.18.0.9:9300]] [навалом/осколок]]; inested: EsRejectedExecutionException [отклоненное выполнение (емкость очереди 50) на org.elasticsearch.action.support.replication.Trans[email protected]12ae9af];

Означает ли это, что я делаю слишком много операций в одном массиве за один раз или слишком много пакетов подряд или что? Есть ли настройка, которую я должен увеличить, или что-то, что я должен делать по-другому?

Один поток предлагает "Я думаю, вам нужно увеличить свой" threadpool.bulk.queue_size "(и, возможно," threadpool.index.queue_size ") из-за недавних настроек по умолчанию". Тем не менее, я не хочу произвольно увеличивать настройку без понимания ошибки.

4b9b3361

Ответ 1

Вы хотите увеличить количество потоковых потоков, доступных в пуле потоков. ES выделяет потоки в нескольких именованных пулах для использования в различных задачах. Эти пулы имеют несколько настроек; тип, размер и размер очереди.

из документов:

Queue_size позволяет контролировать размер очереди ожидающих запросов запросы, которые не имеют потоков для их выполнения. По умолчанию он установлен до -1, что означает его неограниченное. Когда приходит запрос и очередь заполнен, он прервет запрос.

Для меня это означает, что у вас больше запросов на количество в очереди, ожидающих поток из пула, чтобы выполнить один из них, чем ваш текущий размер очереди. В документации, по-видимому, указывается, что размер очереди по умолчанию равен -1 (текст выше говорит об этом) и 50 (в этом вопросе указывается, что объем в доке говорит об этом). Вы можете взглянуть на источник, чтобы быть уверенным в своей версии es ИЛИ установить более высокий номер и посмотреть, не исчезли ли ваши проблемы с массой.

Настройки пула ES-потоков doco

Ответ 2

Мне не хватает репутации, чтобы ответить на комментарий как комментарий.

Это не совсем количество сделанных массовых запросов, это фактически общее количество осколков, которое будет обновляться по заданному node массовыми вызовами. Это означает, что фактическое объемное количество операций внутри массового запроса фактически имеет значение. Например, если у вас есть один node с одним индексом, который работает в ящике с 8 ядрами, с 60 осколками, и вы выдаете массовый запрос, который имеет операции индексирования, которые влияют на все 60 осколков, вы получите это сообщение об ошибке с помощью один запрос на объем.

Если кто-то хочет изменить это, вы можете увидеть, как происходит расщепление внутри org.elasticsearch.action.bulk.TransportBulkAction.executeBulk() рядом с комментарием "перейдите весь запрос и создайте ShardId". Индивидуальные запросы выполняются несколькими строками вниз по строке 293 на версии 1.2.1.

Ответ 3

elasticsearch 1.3.4

наша система 8 ядро ​​* 2

4 наемный работник каждую вставку 300 000 сообщений за 1 мин = > 20 000 в секунду

Я тоже это исключение! затем установите config

elasticsearch.yml

threadpool.bulk.type: fixed
threadpool.bulk.size: 8                 # availableProcessors
threadpool.bulk.queue_size: 500

source

BulkRequestBuilder bulkRequest = es.getClient().prepareBulk();

bulkRequest.setReplicationType  (ReplicationType.ASYNC).setConsistencyLevel(WriteConsistencyLevel.ONE);

loop begin
bulkRequest.add(es.getClient().prepareIndex(esIndexName, esTypeName).setSource(document.getBytes    ("UTF-8")));
loop end

BulkResponse bulkResponse = bulkRequest.execute().actionGet();

4core = > bulk.size 4

то нет ошибки

Ответ 4

У меня была эта проблема, и мое решение стало увеличиваться ulimit -Sn и ulimit Hn для пользователя elasticsearch. Я пошел от 1024 (по умолчанию) до 99999, и все было исправлено.