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

RemoteTransportException[[Смерть][инет [/172.18.0.9:9300]][навалом / осколок]]; nested: EsRejectedExecutionException[отклоненное выполнение (емкость очереди 50) в org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1@12ae9af];

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

Эластичный поиск 1.3.4

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

4 массовых работника, каждая вставка 300000 сообщений в 1 мин => 20000 в секунду

я тоже это исключение! затем установите конфиг

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

тогда нет ошибок

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

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