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了。



目录
相关文章
|
SQL Java 数据库
Seata分布式事务源码分析
Seata分布式事务源码分析
91 0
|
存储 分布式计算 Java
JuiceFS分布式文件系统源码分析(Java层)
讲解了hadoop-common java api层面JuiceFS的实现流程
409 0
JuiceFS分布式文件系统源码分析(Java层)
|
11月前
|
存储 分布式计算 Java
JuiceFS分布式文件系统源码分析(Java层)
JuiceFS分布式文件系统源码分析(Java层)
159 0
|
消息中间件 算法 网络协议
49-微服务技术栈(高级):分布式协调服务zookeeper源码篇(选举机制源码分析)
本篇博文详细分析了FastLeaderElection的算法,其是ZooKeeper的核心部分,结合前面的理论学习部分,可以比较轻松的理解其具体过程。
133 0
|
消息中间件 存储 Java
【分布式技术专题】RocketMQ延迟消息实现原理和源码分析
【分布式技术专题】RocketMQ延迟消息实现原理和源码分析
253 0
【分布式技术专题】RocketMQ延迟消息实现原理和源码分析
|
NoSQL Java Redis
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
239 0
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
|
数据采集 搜索推荐 Python
24、Python快速开发分布式搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图
【百度云搜索:http://www.lqkweb.com】 【搜网盘:http://www.swpan.cn】 1、基本概念 2、反爬虫的目的 3、爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图
6014 0
|
数据采集 NoSQL 调度
scrapy分布式Spider源码分析及实现过程
分布式框架scrapy_redis实现了一套完整的组件,其中也实现了spider,RedisSpider是在继承原scrapy的Spider的基础上略有改动,初始URL不在从start_urls列表中读取,而是从redis起始队列中读取。
1177 0
|
NoSQL 数据库 Redis
scrapy-redis 分布式爬取源码分析
scrapy是Python的一个非常好用的爬虫库,功能非常强大,但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求的并发数),这时候分布式爬虫的优势就显现出来,人多力量大。而scrapy-Redis就是结合了分布式数据库redis,重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫。
3603 0
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?

热门文章

最新文章