lucene + hadoop 分布式搜索运行框架 Nut 1.0a9

2019-03-27 01:05|来源: 网路

1、概述
 不管程序性能有多高,机器处理能力有多强,都会有其极限。能够快速方便的横向与纵向扩展是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


2、特新
 a、热插拔
 b、可扩展
 c、高负载
 d、易使用,与现有项目无缝集成
e、支持排序
f、7*24服务
g、失败转移


3、搜索流程
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读取数据。

 

 4、索引流程
Hadoop Mapper/Reducer 建立索引。再将索引从HDFS分发到各个索引服务器。
对索引的更新分为两种:删除和添加(更新分解为删除和添加)。
a、删除
在HDFS上删除索引,将生成的*.del文件分发到所有的索引服务器上去或者对HDFS索引目录删除索引再分发到对应的索引服务器上去。
b、添加
新添加的数据用另一台服务器来生成。
删除和添加步骤可按不同定时策略来实现。


5、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。

 

 6、设计图

 

 

   
7、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的服务器,依此类推。

 

转自:http://www.blogjava.net/nianzai/archive/2011/02/17/344533.html


转自:http://www.cnblogs.com/qingfeideyi/archive/2012/07/04/2575637

相关问答

更多
  • solr+hadoop(elasticsearch和solr类似,有hadoop模块,你也可以试试) 在不能满足需求的时候可以改底层的lucene
  • 您好,很高兴为您解答。 solr+hadoop好点 elasticsearch和solr类似,有hadoop模块,在不能满足需求的时候可以改底层的lucene 如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】 希望我的回答对您有所帮助,望采纳! ~ O(∩_∩)O~
  • 1、能搭好环境说明水平还不错。 2、下边应该分以下几步走: 一,依据示例程序,自己手写wordcount之类的示例程序,以此充分了解m/r和hdfs的简单原理。 二,针对某些知识点,如hadoop应用场景、hadoop的简单应用等,去百度一下搞定,这样的问题最关键、最需要做的。 三,深入阅读hadoop的源码,把框架的数据流或说工作流搞个大致清楚。 四,试着用hadoop解决一些实际问题和项目应用。 参考下吧。
  • Solr(主要)用于存储和搜索,Hadoop(主要)用于分布式处理。 他们解决不同的问题。 最常见的是使用Solr和HDFS来存储/加载其索引文件 ,以便使用HDFS集群中的现有功能,或者允许通过Solr搜索已处理的Hadoop结果 。 如果您在Google上进行一些搜索,您会发现很多用例,演示文稿和库,例如LucidWorks的Hadoop集成 , Solr + Hadoop或Hortonworks的索引以及在Apache Solr中搜索数据 。 Solr is (mainly) for storage ...
  • Lucene是一个倒置的全文索引。 这意味着它需要所有的文档,将它们分成单词,然后为每个单词生成一个索引。 由于索引是一个精确的字符串匹配,无序,它可以非常快。 假设, varchar字段上的SQL无序索引可能会很快,实际上我认为你会发现大型数据库可以在这种情况下很快地做一个简单的字符串相等查询。 Lucene不必优化事务处理。 当您添加文档时,它不需要确保查询立即查看。 并且不需要优化现有文档的更新。 但是,一天结束的时候,如果你真的想知道,你需要阅读源码。 毕竟,你引用的两件事都是开源的。 Lucene ...
  • 我对Lucene一无所知,但就像一个随意的想法,你试过用一个非常大的数字代替*? [65 TO 99999999] 选择数据类型可以处理的最大数字(假设存在这样的事物)或者至少比可能使用的数字更大的数字。 I know nothing about Lucene really, but just as a random thought, have you tried just using a very big number instead of *? [65 TO 99999999] Pick the l ...
  • 我曾经在一个健康社交网络上工作,我们需要某种搜索和连接搜索功能,我们首先使用neo4j,我们可以得到的密码查询语言给我们留下了深刻印象,并表达了任何请求,但是当你抛出数十亿个节点时为了付出代价,我们开始考虑另一个图形数据库,这次我们进行了大量的研究,测试和OrientDB显然是胜利者,OrientDB具有很高的可扩展性,但问题是你必须自己编写代码,“搜索”算法“如果你想做一些高级的东西(这两个节点之间的共同点是什么),否则你就像SQL一样的查询语言(我不知道/记得他是否有名字)但是你可以做一些有趣的东西有了 ...
  • 要知道您是以独立还是伪分布模式运行hadoop,请验证您的配置文件。 以下信息可能有帮助。 To know if you are running hadoop in Standalone or Pseudo distributed mode, verify your configuration files. Below information might help.
  • 你不能混合和匹配你的lucene版本。 您使用的是4.2.1版。 它与版本3.1.0或3.0.3不兼容。 您需要删除这些依赖项。 WikipediaTokenizer包含在分析器中 - 常见。 此外,您没有履行TokenStream要求的合同。 请参阅TokenStream文档 ,其中描述了TokenStream API的工作流程。 特别是,在调用incrementToken() ,必须调用reset() 。 你应该真的end()和close()它。 WikipediaTokenizer x = wtt.t ...
  • 是的,文件通过网络传输,通常是通过HDFS传输。 与使用HDFS进行非数据本地任务相比,它不会对网络造成任何压力。 如果文件很大,可能会出现网络拥塞,但是你已经把你的jar推送到所有这些任务跟踪器,所以只要你的文件不比你的文件大得多,你的开销就不应该是太糟糕了。 文件的复制与最终将拉动此文件的任务跟踪器的数量完全分开。 复制也将从一个节点链接到另一个节点,无论如何都是具有容错分布式文件系统的成本。 同样,网络拥塞不再是将jar推送到所有任务跟踪器的问题,假设分布式缓存中的文件与jar的大小相同。 总的来说, ...