搜索线程池的elasticsearch队列大小

时间:2015-01-07 18:47:10

标签: elasticsearch threadpool

我有一个整个应用程序的传输客户端实例。我可以处理8个并行搜索到elasticsearch。

但是当我尝试执行10个或更多并行搜索请求时,我收到了esRejected执行异常。

我是否必须增加搜索线程池的队列大小。我可以从elasticsearch.yml

中的客户端或服务器设置执行此操作

感谢。

1 个答案:

答案 0 :(得分:0)

我希望您所说的错误如下:

  

org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor

几天前我遇到了完全相同的问题。我的用例是对弹性搜索的16个并发请求,其中每个请求都是批量插入。在我开始之前,我想解释导致此错误的原因。当您向elasticsearch服务器发送批量请求时,它们是通过线程池处理(默认值= 8)。如果没有理想的线程,则剩余的消息将附加到队列中。如果向elasticsearch发出的请求太多,则会填充此队列。 以下是我尝试的不同解决方案:

  1. 在helpers.bulk调用中,您可以传递chunk_size,默认为500.chunk size是elasticsearch的内部,它将您的数据分成批次,然后进一步传递请求。块大小越大,队列中附加的消息数越少,反之亦然。此解决方案的唯一缺点是随着块大小的增加,您接近达到max_chunk_bytes值(默认为100Mb),这意味着您发送的块大小不应大于此限制。对我来说,每条记录的大小都是2.1kb,因此我很乐意提供40k的大小。
  2. 增加队列大小:您可以在ThreadPool.bulk.queue_size下增加队列大小,默认值为50.增加队列大小意味着您在elasticsearch服务器上放置了更多的内存负载,这实际上取决于您的计算机大小。我使用的机器尺寸有61Gb的内存。我强调通过105个并行请求和1000个块大小来测试具有最大负载的服务器。
  3. 限制并发性:如果您能够以客户端大小处理请求,那么您不会在队列中放入大量的消息请求,并且基本问题已解决。
  4. 上述操作可以通过调用es api:

    来执行
     helpers.bulk(es_client, query, request_timeout=200, chunk_size=self.chunk_size)
    

    request_timeout&等参数chunk_size传递给helpers.bulk的kwargs,后者又调用streaming_bulk。

    请参阅线程池配置here

    帮助方法here

    的详细说明