Nulta: Lucene+Hadoop分布式并行计算搜索框架

今天在微博上看到 @陈利人 分享的关于分布式Lucene的文章,评论里也出现了一些新的基于Lucene和Hadoop的搜索框架,比如这个Nulta。因为自己的毕设是关于分布式索引的,自己也使用过Lucene,Hadoop,一直很关注也很感兴趣,就大致了解了下Nulta这个框架。

根据主页里的介绍,Nulta的整个架构和思路还是不错的,我也能从它的设计中找到自己毕设的一些想法,。现在最新的源码是1.0a9版的,源码内容不多,将几块产品都整合了起来,具体的配置内容在这里给出了。具体Nulta的使用性能,达标可行性,实例情况都有待考察。希望能学到更多东西,我也会继续关注Nulta。作者的博客

概述

不管程序性能有多高,机器处理能力有多强,都会有其极限。能够快速方便的横向与纵向扩展是Nut设计最重要的原则,以此原则形成以分布式并行计算为核心的架构设计。以分布式并行计算为核心的架构设计是Nut区别于Solr、Katta的地方。
Nut是一个Lucene+Hadoop分布式并行计算搜索框架,能对千G以上索引提供7*24小时搜索服务。在服务器资源足够的情况下能达到每秒处理100万次的搜索请求。 

Nut开发环境:jdk1.6.0.23+lucene3.0.3+eclipse3.6.1+hadoop0.20.2+zookeeper3.3.2+hbase0.20.6+memcached+mongodb+linux

概述部分提供了很好的设想,也是引起了我的兴趣。看到了它的开发环境里的工具也都是我比较喜欢的开源产品。

特性
- 热插拔
- 可扩展 
- 高负载 
- 易使用,与现有项目无缝集成
- 支持排序 
- 7*24服务 
- 失败转移

搜索流程

 Nut由Index、Search、Client、Cache和DB五部分构成。(Cache实现了对memcached的支持,DB实现了对hbase,mongodb的支持) Client处理用户请求和对搜索结果排序。Search对请求进行搜索,Search上只放索引,数据存储在DB中,Nut将索引和存储分离。Cache缓存的是搜索条件和结果文档id。DB存储着数据,Client根据搜索排序结果,取出当前页中的文档id从DB上读取数据。
用户发起搜索请求给由Nut Client构成的集群,由某个Nut Client根据搜索条件查询Cache服务器是否有该缓存,如果有缓存根据缓存的文档id直接从DB读取数据,如果没有缓存将随机选择一组搜索服务器组(Search Group i),将查询条件同时发给该组搜索服务器组里的n台搜索服务器,搜索服务器将搜索结果返回给Nut Client由其排序,取出当前页文档id,将搜索条件和当前文档id缓存,同时从DB读取数据。

整个搜索流程应该描述的还是比较清楚的,不过不够具体。整个构想也比较直接,没有很复杂的集成。

索引流程

 Hadoop Mapper/Reducer 建立索引。再将索引从HDFS分发到各个索引服务器。 对索引的更新分为两种:删除和添加

- 删除: 在HDFS上删除索引,将生成的.del文件分发到所有的索引服务器上去或者对HDFS索引目录删除索引再分发到对应的索引服务器上去。 

- 添加 :新添加的数据用另一台服务器来生成。 删除和添加步骤可按不同定时策略来实现。

Nut分布式并行计算特点 

Nut分布式并行计算虽然也是基于M/R模型,但是与Hadoop M/R模型是不同的。在Hadoop M/R模型中 Mapper和Reducer是一个完整的流程,Reducer依赖于Mapper。数据源通过Mapper分发本身就会消耗大量的I/O,并且是消耗I/O最大的部分。所以Hadoop M/R 并发是有限的。Nut M/R模型是将Mapper和Reducer分离,各自独立存在。在Nut中
索引以及索引管理 构成M,搜索以及搜索服务器组 构成 R。

 以一个分类统计来说明Nut分布式并行计算的流程。假设有10个分类,对任意关键词搜索要求统计出该关键词在这10个分类中的总数。同时假设有10组搜索服务器。索引以及索引管理进行索引数据的Mapper,这块是后台独自运行管理的。Nut Client将这10个分类统计分发到10组搜索服务器上,每组搜索服务器对其中一个分类进行Reducer,并且每组搜索服务器可进行多级Reducer。最后将最终结果返回给Nut Client。

设计图


Zookeeper服务器状态管理策略
在架构设计上通过使用多组搜索服务器可以支持每秒处理100万个搜索请求。 每组搜索服务器能处理的搜索请求数在1万—1万5千之间。如果使用100组搜索服务器,理论上每秒可处理100万个搜索请求。
假如每组搜索服务器有100份索引放在100台正在运行中搜索服务器(run)上,那么将索引按照如下的方式放在备用中搜索服务器(bak)上:

index 1,index 2,index 3,index 4,index 5,index 6,index 7,index 8,index 9,index 10放在B 1 上

index 6,index 7,index 8,index 9,index 10,index 11,index 12,index 13,index 14,index 15放在B 2上

...

index 96,index 97,index 98,index 99,index 100,index 5,index 4,index 3,index 2,index 1放在最后一台备用搜索服务器上。

那么每份索引会存在3台机器中(1份正在运行中,2份备份中)。 尽管这样设计每份索引会存在3台机器中,仍然不是绝对安全的。假如运行中的index 1,index 2,index 3同时宕机的话,那么就会有一份索引搜索服务无法正确启用。这样设计,作者认为是在安全性和机器资源两者之间一个比较适合的方案。
备用中的搜索服务器会定时检查运行中搜索服务器的状态。一旦发现与自己索引对应的服务器宕机就会向lock申请分布式锁,得到分布式锁的服务器就将自己加入到运行中搜索服务器组,同时从备用搜索服务器组中删除自己,并停止运行中搜索服务器检查服务。
为能够更快速的得到搜索结果,设计上将搜索服务器分优先等级。通常是将最新的数据放在一台或几台内存搜索服务器上。通常情况下前几页数据能在这几台搜索服务器里搜索到。如果在这几台搜索服务器上没有数据时再向其他旧数据搜索服务器上搜索。 优先搜索等级的逻辑是这样的:9最大为搜索全部服务器并且9不能作为level标识。当搜索等级level为1,搜索优先级为1的服务器,当level为2时搜索优先级为1和2的服务器,依此类推。

时间: 2024-08-01 14:38:02

Nulta: Lucene+Hadoop分布式并行计算搜索框架的相关文章

LucenePlus 1.2 发布,基于 Lucene 的全文搜索框架

LucenePlus 1.2 发布了,这是一款基于 Lucene 的全文搜索框架. 更新如下: 优化代码结构.更加易用简洁 增加字段支持 float,binary,double,text 自定义 query 查询 排序重新定义 增加 LucenePlus 数据源.更清晰明了.随意切换 文章转载自 开源中国社区 [http://www.oschina.net]

基于CentOS的Hadoop分布式环境的搭建开发_Linux

首先,要说明的一点的是,我不想重复发明轮子.如果想要搭建Hadoop环境,网上有很多详细的步骤和命令代码,我不想再重复记录. 其次,我要说的是我也是新手,对于Hadoop也不是很熟悉.但是就是想实际搭建好环境,看看他的庐山真面目,还好,还好,最好看到了.当运行wordcount词频统计的时候,实在是感叹hadoop已经把分布式做的如此之好,即使没有分布式相关经验的人,也只需要做一些配置即可运行分布式集群环境. 好了,言归真传. 在搭建Hadoop环境中你要知道的一些事儿: 1.hadoop运行于

浅析云计算分布式并行计算:编程模型

MapReduce 是由Google公司开发的一个针对大规模群组中的海量数据处理的分布式编程模型.它实现了两个功能:Map把一个函数应用于集合中的所有成员,然后返回一个基于这个处理的结果集.而Reduce是把从两个或更多个Map中,通过多个线程,进程或者独立系统并行执行处理的结果集进行分类和归纳.Map() 和 Reduce() 两个函数可能会并行运行,即使不是在同一的系统的同一时刻. 微软于2010年12月21日发布了分布式并行计算基础平台--Dryad测试版,成为谷歌MapReduce分布式

AI大事件 | 人类理解行为数据集推出,Uber发布自家分布式深度学习框架

呜啦啦啦啦啦大家好呀,又到了本周的AI大事件时间了.过去的一周中AI圈都发生了什么?大佬们互撕了哪些问题?研究者们发布了哪些值得一读的论文?又有哪些开源的代码和数据库可以使用了?文摘菌带你盘点过去一周AI大事件! 新闻 AlphaGo Zero: 从零开始的学习 来源:DEEPMIND.COM: 链接:https://deepmind.com/blog/alphago-zero-learning-scratch/?utm_campaign=Revue%20newsletter&utm_mediu

Hadoop分布式文件系统:架构和设计要点

Hadoop分布式文件系统:架构和设计要点 原文:http://hadoop.apache.org/core/docs/current/hdfs_design.html一.前提和设计目标 1.硬件错误是常态,而非异常情况,HDFS可能是有成百上千的server组成,任何一个组件都有可能一直失效,因此错误检测和快速.自动的恢复是HDFS的核心架构目标. 2.跑在HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理:比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量. 3.

Hadoop分布式文件系统和OpenStack对象存储有何不同?

最近在Quora上有人提到一个问题,有关Hadoop分布式文件系统和OpenStack对象存储的不同. 问题原文如下: "HDFS (Hadoop分布式文件系统)和OpenStack对象存储(OpenStack Object Storage)似乎都有着相似的目的:实现冗余.快速.联网的存储.什么样的技术特性让这两种系统因而不一样?这两种存储系统最终趋于融合是否大有意义?" 问题提出之后,很快有OpenStack的开发者进行了回复.本文在此摘抄了前两名回复进行翻译,以供各位参考. 排名第

Hadoop分布式文件系统和OpenStack对象存储有何不同

最近在Quora上有人提到一个问题,有关Hadoop分布式文件系统和OpenStack对象存储的不同.             问题原文如下: "HDFS (Hadoop分布式文件系统)和OpenStack对象存储(OpenStack Object Storage)似乎都有着相似的目的:实现冗余.快速.联网的存储.什么样的技术特性让这两种系统因而不一样?这两种存储系统最终趋于融合是否大有意义?" 问题提出之后,很快有OpenStack的开发者进行了回复.本文在此摘抄了前两名回复进行翻译

Java访问Hadoop分布式文件系统HDFS的配置说明_java

配置文件 m103替换为hdfs服务地址. 要利用Java客户端来存取HDFS上的文件,不得不说的是配置文件hadoop-0.20.2/conf/core-site.xml了,最初我就是在这里吃了大亏,所以我死活连不上HDFS,文件无法创建.读取. <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <co

Hadoop中的Python框架的使用指南_python

 最近,我加入了Cloudera,在这之前,我在计算生物学/基因组学上已经工作了差不多10年.我的分析工作主要是利用Python语言和它很棒的科学计算栈来进行的.但Apache Hadoop的生态系统大部分都是用Java来实现的,也是为Java准备的,这让我很恼火.所以,我的头等大事变成了寻找一些Python可以用的Hadoop框架. 在这篇文章里,我会把我个人对这些框架的一些无关科学的看法写下来,这些框架包括:     Hadoop流     mrjob     dumbo     hadoo