solr3.5 分布式groupby源码分析

简介: 假期梳理了之前在新浪博客的文档,将一些有用的内容搬到这里。本文是关于Sole3.5 分布式GroupBy 源码分析。

摘要  

从流程-细节-限制等进行分析,最后yy下性能


1 solr3.5 分布式groupby 关键流程  

solr3.5 distribute groupby merger 结点需要向处理结点发3网络请求,分布式facet2次网络请求。    


SearcherHandler.handleRequestBody总领下,进queryComponentprepare->process->finished    

process又分本地和分布式类型,并且两种类型process中又分 state 有序请求:search->topN->feild  

-->整个流程依然和solr一般分布式查询一致。查询框架的稳定。    

-->groupby 性能不好的!!

2 querycomponent

prepare

GroupingSpecification groupingSpec = new GroupingSpecification(); 总领grouping相关参数初始化。 其中 GROUP_TRUNCATE 针对topN相关性 groupby,也即截断groupby,在整个3序列都不支持,所以,默认值是false。在4.0也是不支持 group truncate func的。http://wiki.apache.org/solr/DistributedSearch


process

 group.distibuted.first group.distibuted.second

-->这里的process是接受结点具体的工作,协调结点是对应 distributedProcess,在distributeProcess中有阶段state的概念。其中分布式阶段中,初始化      group.distibuted.first SearchGroupsRequestFactory constructRequest中赋值为true
     group.distibuted.second
TopGroupsShardRequestFactory constructRequest中赋值为true
   
SearchGroupsRequestFactoryTopGroupsShardRequestFactory正是distributeProcess中阶段任务    
     

int nextStage = ResponseBuilder.STAGE_DONE;
        ShardRequestFactory shardRequestFactory = null;
if (rb.stage < ResponseBuilder.STAGE_PARSE_QUERY) {
          nextStage = ResponseBuilder.STAGE_PARSE_QUERY;
        } elseif (rb.stage == ResponseBuilder.STAGE_PARSE_QUERY) {
          createDistributedIdf(rb);
          nextStage = ResponseBuilder.STAGE_TOP_GROUPS;
        } elseif (rb.stage < ResponseBuilder.STAGE_TOP_GROUPS) {
          nextStage = ResponseBuilder.STAGE_TOP_GROUPS;
        } elseif (rb.stage == ResponseBuilder.STAGE_TOP_GROUPS) {
          shardRequestFactory = new SearchGroupsRequestFactory();
//-->第一阶段          
          nextStage = ResponseBuilder.STAGE_EXECUTE_QUERY;
        } elseif (rb.stage < ResponseBuilder.STAGE_EXECUTE_QUERY) {
          nextStage = ResponseBuilder.STAGE_EXECUTE_QUERY;
        } elseif (rb.stage == ResponseBuilder.STAGE_EXECUTE_QUERY) {
          shardRequestFactory = new TopGroupsShardRequestFactory();
//-->第二阶段          
          nextStage = ResponseBuilder.STAGE_GET_FIELDS;
        } elseif (rb.stage < ResponseBuilder.STAGE_GET_FIELDS) {
          nextStage = ResponseBuilder.STAGE_GET_FIELDS;
        } elseif (rb.stage == ResponseBuilder.STAGE_GET_FIELDS) {
          shardRequestFactory = new StoredFieldsShardRequestFactory();
          nextStage = ResponseBuilder.STAGE_DONE;
        }
if (shardRequestFactory != null) {
for (ShardRequest shardRequest : shardRequestFactory.constructRequest(rb)) {
            rb.addRequest(this, shardRequest);
          }
        }
        return nextStage;
 }

 具体接受结点的 每一阶段都
         CommandHandler commandHandler = secondPhaseBuilder.build();
         commandHandler.execute(); //
提交请求的          SearchGroupsResultTransformer serializer =                                                     new  SearchGroupsResultTransformer(searcher);
         commandHandler.processResult(result, serializer));

finished    

合并结果和结构的结构化组织


限制  

--> tuncate func 3序列和4.0 都不支持

--> 一次分布式请求,需要发起3次网络,n个结点,就是3n 次请求,相对facet 2n性能更差些

group.field  Group based on the unique values of a field. The field must currently be single-valued and must be either indexed, or be another field type that has a value source and works in a function query - such as ExternalFileField. Note: for Solr 3.x versions the field must by a string like field such as StrField or TextField, otherwise a http status 400 is returned.
性能  

-->优化思路

调整分布式结构;优化接收结点具体group性能;添加各层cache调整分布式结构    

如果合并请求,那么,一次返回内容更多、等待时机更长、结点资源hold更长时间。在分布查询和一般查询同时叠加的时候,资源共享不好。  


如果不合并请求,那么,就分多次并发了。多次并发任务分解了,但是网络开销多了。  而目前普遍的做法就是并发+分阶段设计的。可以实现部分结果返回。当网络或者结点不稳定的时候。  

另外一种改进方法:流式处理,每次topN结果往下一结点转移。这种系统维护成本比较高。有论文证明这种流式比较好的,忘了具体论文名称,回头找找。  

优化接收结点具体group性能是当前主要的入口点了。而这里看源码,和facet类型,已经依赖了fieldCache了。    

更底层的优化,就是重组索引结构,帮助快速group了。



目录
相关文章
|
1月前
|
存储 分布式计算 测试技术
探索Apache Hudi核心概念 (4) - Clustering
探索Apache Hudi核心概念 (4) - Clustering
64 2
|
6月前
|
分布式计算 API 流计算
22MyCat - Spark/Storm 对join扩展(简略)
22MyCat - Spark/Storm 对join扩展(简略)
30 0
|
3月前
|
存储 SQL 关系型数据库
Apache Doris 聚合函数源码阅读与解析|源码解读系列
Apache Doris Active Contributor 隐形通过本文记录下对源码的理解,以方便新人快速上手源码开发。
Apache Doris 聚合函数源码阅读与解析|源码解读系列
|
10月前
|
分布式计算 Spark
|
存储 关系型数据库 大数据
java大数据组件HBase
java大数据组件HBase
134 0
|
分布式数据库 Hbase Java
hbase region split源码分析
hbase region split : split执行调用流程: 1.HbaseAdmin发起split:### 2.RSRpcServices实现类执行split(Implements the regionserver RPC services.)### 3.CompactSplitThread类与SplitRequest类用来执行region切割:### 4.splitRequest执行doSplitting操作### 4.1初始化两个子region### 4.2执行切割#### 4.2.1:(创建子region。
1757 0
|
搜索推荐 定位技术 Apache
Elasticsearch中nested聚合操作
在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档。 父子文档的实现,至少包含以下两种方式: 1)父子文档 2)Nested嵌套类型
854 0
|
存储 固态存储 测试技术
基于Lucene查询原理分析Elasticsearch的性能
基于Lucene查询原理分析Elasticsearch的性能
568 1
|
SQL 存储 分布式计算
Kylin查询源码分析
什么是Kylin Apache Kylin是一个开源的、分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区。它能在亚秒内查询巨大的表。 Kylin的查询高性能主要依赖于Cube理论,如图所示: 它将表字段划分为维度和量度,通过预先计算,在维度上进行量度聚合并保存聚合结果,而根据
Kylin查询源码分析
|
分布式数据库 Hbase 分布式计算
带你读《HBase原理与实践》之三:HBase依赖服务
Apache HBase是基于Apache Hadoop构建的一个高可用、高性能、多版本的分布式NoSQL数据库,是Google BigTable的开源实现,通过在廉价服务器上搭建大规模结构化存储集群,提供海量数据高性能的随机读写能力。