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')设置,因为最近的默认设置。”但是,我不想在不了解故障的情况下随意增加设置。
答案 0 :(得分:37)
我缺乏回复评论作为评论的声誉。
不完全是批量请求的数量,它实际上是批量调用将在给定节点上更新的分片总数。这意味着批量请求中实际批量操作的内容实际上很重要。例如,如果您有一个单个节点,具有单个索引,在8核心框上运行,具有60个分片,并且您发出的批量请求具有影响所有60个分片的索引操作,那么您将收到此错误消息批量请求。
如果有人想要改变这一点,你可以看到在评论附近的org.elasticsearch.action.bulk.TransportBulkAction.executeBulk()里面发生分裂"检查所有请求并创建一个ShardId" 。个别请求在版本1.2.1的第293行附近发生了几行。
答案 1 :(得分:20)
您希望增加线程池中可用的批量线程数。 ES在多个命名池中设置线程以用于各种任务。这些池有一些设置;类型,大小和队列大小。
来自文档:
queue_size允许控制pending的队列大小 没有线程执行它们的请求。默认情况下,它已设置 到-1意味着它无界限。当请求进入和队列时 已满,它将中止请求。
对我而言,这意味着您有更多的批量请求排队等待来自池的线程执行其中一个线程而不是当前的队列大小。文档似乎表明队列大小默认为-1(上面的文字说明)和50(文档中的批量调用说明)。您可以take a look at the source确定您的es版本或设置较高的数字,看看您的批量问题是否已经消失。
答案 2 :(得分:6)
elasticsearch 1.3.4
我们的系统8核心* 2
4个散货工人每1分钟插入300,000条消息=>每秒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
然后没有错误
答案 3 :(得分:3)
我遇到了这个问题,我的解决方案最终为elasticsearch用户增加了ulimit -Sn
和ulimit Hn
。我从1024(默认)到99999,然后清理东西。