我缺乏回复评论作为评论的声誉.
它并不完全是批量请求的数量,它实际上是批量调用将在给定节点上更新的分片总数.这意味着批量请求中实际批量操作的内容实际上很重要.例如,如果您有一个单个节点,具有单个索引,在8核心框上运行,具有60个分片,并且您发出的批量请求具有影响所有60个分片的索引操作,那么您将收到此错误消息批量请求.
如果有人想要改变这一点,你可以在评论"查看所有请求并创建ShardId"附近的org.elasticsearch.action.bulk.TransportBulkAction.executeBulk()内部看到分裂.个别请求在版本1.2.1的第293行附近发生了几行.
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();
4core => bulk.size 4
然后没有错误
我缺乏回复评论作为评论的声誉.
它并不完全是批量请求的数量,它实际上是批量调用将在给定节点上更新的分片总数.这意味着批量请求中实际批量操作的内容实际上很重要.例如,如果您有一个单个节点,具有单个索引,在8核心框上运行,具有60个分片,并且您发出的批量请求具有影响所有60个分片的索引操作,那么您将收到此错误消息批量请求.
如果有人想要改变这一点,你可以在评论"查看所有请求并创建ShardId"附近的org.elasticsearch.action.bulk.TransportBulkAction.executeBulk()内部看到分裂.个别请求在版本1.2.1的第293行附近发生了几行.
您希望增加线程池中可用的批量线程数.ES在多个命名池中设置线程以用于各种任务.这些池有一些设置; 类型,大小和队列大小.
来自文档:
queue_size允许控制没有线程执行它们的挂起请求队列的大小.默认情况下,它设置为-1,这意味着它是无界的.当请求进入并且队列已满时,它将中止请求.
对我而言,这意味着您有更多的批量请求排队等待来自池的线程执行其中一个线程而不是当前的队列大小.文档似乎表明队列大小默认为-1(上面的文字说明)和50(文档中的批量调用说明).您可以查看源代码以确定您的es版本或设置更高的数字,看看您的批量问题是否已经消失.
ES线程池设置doco