怎样深入理解batched_reduce_size

这期内容当中小编将会给大家带来有关怎样深入理解batched_reduce_size,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

创新互联自2013年起,先为伊川等服务建站,伊川等地企业,进行企业商务咨询服务。为伊川企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

在search 流程中,协调节点收到客户端的查询请求后,将请求涉及到的转发到其他数据节点,这个过程中会以 shard 为单位发送 query请求,待所有的请求都收到响应(QuerySearchResult)后进行下一步处理。

batched_reduce_size 参数用于控制在Search过程中,当协调节点收到指定的结果时执行一次 reduce。

官网对他的解释如下:

(Optional, integer) The number of shard results that should be reduced at once on the coordinating node. This value should be used as a protection mechanism to reduce the memory overhead per search request if the potential number of shards in the request can be large. Defaults to 512.

这个解释看上去难以理解本质,因此查阅一下代码,重新解释一下这个参数的含义:协调节点并行发送完 query 请求后,收到的响应QuerySearchResult达到batched_reduce_size数量时,执行一次 reduce,reduce 执行以下操作:

  1. 如果请求中含有聚合,则对这批结果执行聚合

  2. 如果请求中需要计算 TopN,则对这批结果执行计算

因此这个参数的主要作用是防止协调节点为了汇总全部结果而占用太多内存。

主要实现代码如下,bufferSize就是batched_reduce_size设置的值,默认为512

private synchronized void consumeInternal(QuerySearchResult querySearchResult) {
   if (index == bufferSize) {
       if (hasAggs) {
           InternalAggregations reducedAggs = InternalAggregations.reduce(Arrays.asList(aggsBuffer), reduceContext);
           Arrays.fill(aggsBuffer, null);
           aggsBuffer[0] = reducedAggs;
       }
       if (hasTopDocs) {
           TopDocs reducedTopDocs = mergeTopDocs(Arrays.asList(topDocsBuffer),
                   querySearchResult.from() + querySearchResult.size(), 0);
           Arrays.fill(topDocsBuffer, null);
           topDocsBuffer[0] = reducedTopDocs;
       }
       numReducePhases++;
       index = 1;
   }
   final int i = index++;
   if (hasAggs) {
       aggsBuffer[i] = (InternalAggregations) querySearchResult.consumeAggs();
   }
   if (hasTopDocs) {
       topDocsBuffer[i] = topDocs.topDocs;
   }
}

上述就是小编为大家分享的怎样深入理解batched_reduce_size了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


当前名称:怎样深入理解batched_reduce_size
本文URL:http://myzitong.com/article/pjicic.html