ElasticSearch提供有关队列大小的错误

Dav*_*fer 26 elasticsearch

RemoteTransportException [[死亡] [INET [/172.18.0.9:9300] [散装/碎片]]; 嵌套:EsRejectedExecutionException [在org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction$1@12ae9af]上被拒绝执行(队列容量50);

这是否意味着我一次在一个批量中进行太多操作,或连续出现太多批量,或者是什么?有没有我应该增加的设置或我应该做的不同的事情?

一个帖子暗示"我认为你需要增加你的'threadpool.bulk.queue_size'(以及可能'threadpool.index.queue_size')设置,因为最近的默认设置." 但是,我不想在不了解故障的情况下任意增加设置.

小智 37

我缺乏回复评论作为评论的声誉.

它并不完全是批量请求的数量,它实际上是批量调用将在给定节点上更新的分片总数.这意味着批量请求中实际批量操作的内容实际上很重要.例如,如果您有一个单个节点,具有单个索引,在8核心框上运行,具有60个分片,并且您发出的批量请求具有影响所有60个分片的索引操作,那么您将收到此错误消息批量请求.

如果有人想要改变这一点,你可以在评论"查看所有请求并创建ShardId"附近的org.elasticsearch.action.bulk.TransportBulkAction.executeBulk()内部看到分裂.个别请求在版本1.2.1的第293行附近发生了几行.


mco*_*lin 20

您希望增加线程池中可用的批量线程数.ES在多个命名池中设置线程以用于各种任务.这些池有一些设置; 类型,大小和队列大小.

来自文档:

queue_size允许控制没有线程执行它们的挂起请求队列的大小.默认情况下,它设置为-1,这意味着它是无界的.当请求进入并且队列已满时,它将中止请求.

对我而言,这意味着您有更多的批量请求排队等待来自池的线程执行其中一个线程而不是当前的队列大小.文档似乎表明队列大小默认为-1(上面的文字说明)和50(文档中的批量调用说明).您可以查看源代码以确定您的es版本或设置更高的数字,看看您的批量问题是否已经消失.

ES线程池设置doco


小智 6

elasticsearch 1.3.4

我们的系统8核心*2

每个批量工作者每1分钟插入300,000条消息=>每秒20,000

我也是那个例外!然后设置配置

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();
Run Code Online (Sandbox Code Playgroud)

4core => bulk.size 4

然后没有错误

  • curl -XPUT localhost:9200/_cluster/settings -d'{"transient":{"threadpool.bulk.queue_size":500}}' (3认同)