??xml version="1.0" encoding="utf-8" standalone="yes"?>
code: http://code.google.com/p/nutla/
一、安?br />
1?nbsp;安装虚拟?Oracle VM VirtualBox4.0.4
2?nbsp;在虚拟机下安?Red Hat 6.0
3?nbsp;安装jdk jdk-6u24-linux-i586.bin 安装路径为:/home/nianzai/jdk1.6.0_24
4?nbsp;安装hadoop hadoop-0.20.2.tar.gz 安装路径为:/home/nianzai/hadoop-0.20.2
5?nbsp;安装zookeeper zookeeper-3.3.3.tar.gz 安装路径为:/home/nianzai/zookeeper-3.3.3
6?nbsp;安装hbase hbase-0.90.2.tar.gz 安装路径为:/home/nianzai/hbase-0.90.2
二、配|?br />
1、Linux配置
ssh-keygen –t rsa -P ''
cd .ssh
cp id_rsa.pub authorized_keys
/etc/hosts里增?192.168.195.128 master
/etc/profile 里增?br />
export JAVA_HOME=/home/nianzai/jdk1.6.0_24
export PATH=$PATH:$JAVA_HOME/bin
2、hadoop配置
hadoop-env.sh
JAVA_HOME=/home/nianzai/jdk1.6.0._24
core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/nianzai/hadoop</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
</configuration>
masters
master
sh hadoop namenode -format
sh start-all.sh
sh hadoop fs -mkdir input
3、zookeeper配置
zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/nianzai/zkdata
clientPort=2181
sh zkServer.sh start
4、hbase配置
hbase-env.sh
export JAVA_HOME=/home/nianzai/jdk1.6.0_24
export HBASE_MANAGES_ZK=false
hbase0.90.2 lib目录下hadoop-core-0.20-append-r1056497.jar删除Q替换成hadoop0.20.2 下的hadoop-0.20.2-core.jar
hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master</value>
</property>
</configuration>
regionservers
master
sh start-hbase.sh
Nut是一个Lucene+Hadoop分布式ƈ行计搜索框Ӟ能对千G以上索引提供7*24时搜烦服务。在服务器资源够的情况下能辑ֈ每秒处理100万次的搜索请求?br />
Nut开发环境:jdk1.6.0.23+lucene3.0.3+eclipse3.6.1+hadoop0.20.2+zookeeper3.3.2+hbase0.20.6+memcached+mongodb+linux
2、特?br />
a、热插拔
b、可扩展
c、高负蝲
d、易使用,与现有项目无~集?br />
e、支持排?br />
f?*24服务
g、失败{U?
3、搜索流E?br />
Nut由Index、Search、Client、Cache和DB五部分构成?Cache实现了对memcached的支?DB实现了对hbase,mongodb的支?
Client处理用户h和对搜烦l果排序。Search对请求进行搜索,Search上只攄引,数据存储在DB中,Nut烦引和存储分离。Cache~存的是搜烦条g和结果文档id。DB存储着数据QClientҎ(gu)搜烦排序l果,取出当前中的文id从DB上读取数据?/p>
用户发v搜烦hl由Nut Client构成的集,由某个Nut ClientҎ(gu)搜烦条g查询Cache服务器是否有该缓存,如果有缓存根据缓存的文档id直接从DBd数据Q如果没有缓存将随机选择一l搜索服务器l?Search Group i),查询条件同时发l该l搜索服务器l里的n台搜索服务器Q搜索服务器搜索结果返回给Nut Client由其排序Q取出当前页文idQ将搜烦条g和当前文id~存Q同时从DBd数据?/p>
4、烦引流E?br /> Hadoop Mapper/Reducer 建立索引。再烦引从HDFS分发到各个烦引服务器?br /> 对烦引的更新分ؓ两种Q删除和dQ更新分解ؓ删除和添加)?br /> a、删?br /> 在HDFS上删除烦引,生成的*.del文g分发到所有的索引服务器上L者对HDFS索引目录删除索引再分发到对应的烦引服务器上去?br /> b、添?br /> 新添加的数据用另一台服务器来生成?br /> 删除和添加步骤可按不同定时策略来实现?/p>
5、Nut分布式ƈ行计特?br />
Nut分布式ƈ行计虽然也是基于M/R模型Q但是与Hadoop M/R模型是不同的。在Hadoop M/R模型?Mapper和Reducer是一个完整的程QReducer依赖于Mapper。数据源通过Mapper分发本n׃消耗大量的I/OQƈ且是消耗I/O最大的部分。所以Hadoop M/R q发是有限的?br />
Nut M/R模型是将Mapper和Reducer分离Q各自独立存在。在Nut?索引以及索引理 构成M,搜烦以及搜烦服务器组 构成 R?br />
以一个分cȝ计来说明Nut分布式ƈ行计的程。假设有10个分c,对Q意关键词搜烦要求l计关键词在q?0个分cM的L。同时假设有10l搜索服务器。烦引以及烦引管理进行烦引数据的MapperQ这块是后台独自q行理的。Nut Client这10个分cȝ计分发到10l搜索服务器上,每组搜烦服务器对其中一个分c进行ReducerQƈ且每l搜索服务器可进行多UReducer。最后将最l结果返回给Nut Client?/p>
6、设计图
7、Zookeeper服务器状态管理策?/p>
在架构设计上通过使用多组搜烦服务器可以支持每U处?00万个搜烦h?br /> 每组搜烦服务器能处理的搜索请求数?万??千之间。如果?00l搜索服务器Q理Z每秒可处?00万个搜烦h?/p>
假如每组搜烦服务器有100份烦引放?00台正在运行中搜烦服务?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台机器中Q?份正在运行中Q?份备份中Q?br />
管q样设计每䆾索引会存?台机器中Q仍然不是绝对安全的。假如运行中的index 1,index 2,index 3同时宕机的话Q那么就会有一份烦引搜索服务无法正启用。这栯计,作者认为是在安全性和机器资源两者之间一个比较适合的方案?/p>
备用中的搜烦服务器会定时查运行中搜烦服务器的状态。一旦发C自己索引对应的服务器宕机׃向lock甌分布式锁Q得到分布式锁的服务器就自己加入到q行中搜索服务器l,同时从备用搜索服务器l中删除自己Qƈ停止q行中搜索服务器查服务?/p>
够更快速的得到搜烦l果Q设计上搜索服务器分优先等U。通常是将最新的数据攑֜一台或几台内存搜烦服务器上。通常情况下前几页数据能在q几台搜索服务器里搜索到。如果在q几台搜索服务器上没有数据时再向其他旧数据搜索服务器上搜索?br /> 优先搜烦{的逻辑是这LQ?最大ؓ搜烦全部服务器ƈ?不能作ؓlevel标识。当搜烦{level?Q搜索优先?的服务器Q当level?时搜索优先??的服务器Q依此类推?br />
二、配|?br />
1、Linux配置
ssh-keygen –t rsa -P ''
cd .ssh
cp id_rsa.pub authorized_keys
/etc/hosts里增?192.168.195.128 nz q且?27.0.0.1 改ؓ 192.168.195.128
2、hadoop配置
hadoop-env.sh
JAVA_HOME=/home/nianzai/jdk1.6.0._22
core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-nianzai</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://nz:9000</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>nz:9001</value>
</property>
</configuration>
sh hadoop namenode -format
sh start-all.sh
sh hadoop fs -mkdir input
3、zookeeper配置
zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/nianzai/zkdata
clientPort=2181
sh zkServer.sh start
4、hbase配置
hbase-env.sh
export JAVA_HOME=/home/nianzai/jdk1.6.0_22
export HBASE_MANAGES_ZK=false
hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://nz:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>nz</value>
</property>
</configuration>
regionservers
nz
sh start-hbase.sh
2、特?br />
a、热插拔
b、可扩展
c、高负蝲
d、易使用,与现有项目无~集?br />
e、支持排?br />
f?*24服务
g、失败{U?
3、搜索流E?br />
Nut由Index、Search、Client、Cache和DB五部分构成?Cache默认使用memcached,DB默认使用hbase)
Client处理用户h和对搜烦l果排序。Search对请求进行搜索,Search上只攄引,数据存储在DB中,Nut烦引和存储分离。Cache~存的是搜烦条g和结果文档id。DB存储着数据QClientҎ(gu)搜烦排序l果,取出当前中的文id从DB上读取数据?/p>
用户发v搜烦hl由Nut Client构成的集,由某个Nut ClientҎ(gu)搜烦条g查询Cache服务器是否有该缓存,如果有缓存根据缓存的文id直接从DBd数据Q如果没有缓存将随机选择一l搜索服务器l?Search Group i),查询条件同时发l该l搜索服务器l里的n台搜索服务器Q搜索服务器搜索结果返回给Nut Client由其排序Q取出当前页文idQ将搜烦条g和当前文id~存Q同时从DBd数据?br />
4、烦引流E?br /> Hadoop Mapper/Reducer 建立索引。再烦引从HDFS分发到各个烦引服务器?br /> 对烦引的更新分ؓ两种Q删除和dQ更新分解ؓ删除和添加)?br /> a、删?br /> 在HDFS上删除烦引,生成的*.del文g分发到所有的索引服务器上L者对HDFS索引目录删除索引再分发到对应的烦引服务器上去?br /> b、添?br /> 新添加的数据用另一台服务器来生成?br /> 删除和添加步骤可按不同定时策略来实现?/p>
5、Zookeeper服务器状态管理策?/p>
在架构设计上通过使用多组搜烦服务器可以支持每U处?00万个搜烦h?br /> 每组搜烦服务器能处理的搜索请求数?万??千之间。如果?00l搜索服务器Q理Z每秒可处?00万个搜烦h?/p>
假如每组搜烦服务器有100份烦引放?00台正在运行中搜烦服务?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台机器中Q?份正在运行中Q?份备份中Q?br />
管q样设计每䆾索引会存?台机器中Q仍然不是绝对安全的。假如运行中的index 1,index 2,index 3同时宕机的话Q那么就会有一份烦引搜索服务无法正启用。这栯计,作者认为是在安全性和机器资源两者之间一个比较适合的方案?/p>
备用中的搜烦服务器会定时查运行中搜烦服务器的状态。一旦发C自己索引对应的服务器宕机׃向lock甌分布式锁Q得到分布式锁的服务器就自己加入到q行中搜索服务器l,同时从备用搜索服务器l中删除自己Qƈ停止q行中搜索服务器查服务?/p>
够更快速的得到搜烦l果Q设计上搜索服务器分优先等U。通常是将最新的数据攑֜一台或几台内存搜烦服务器上。通常情况下前几页数据能在q几台搜索服务器里搜索到。如果在q几台搜索服务器上没有数据时再向其他旧数据搜索服务器上搜索?br /> 优先搜烦{的逻辑是这LQ?最大ؓ搜烦全部服务器ƈ?不能作ؓlevel标识。当搜烦{level?Q搜索优先?的服务器Q当level?时搜索优先??的服务器Q依此类推?br />
1、概q?br /> 只ؓlucene提供分布式搜索框架?*24千G以上索引文g支持数千万的用h索访问?br /> Nut开发环境:jdk1.6.0.21+lucene3.0.2+eclipse3.6+hadoop0.20.2+zookeeper3.3.1+linux
2、特?br />
a、热插拔
b、可扩展
c、高负蝲
d、易使用,与现有项目无~集?br />
e、支持排?br />
f?*24服务
g、失败{U?
3、搜索流E?br /> Nut由Index、Search、Client、Cache和DB五部分构成?br /> Client处理用户h和对搜烦l果排序。Search对请求进行搜索,Search上只攄引,数据存储在DB中,Nut烦引和存储分离。Cache~存的是搜烦条g和结果文id。DB存储着数据QClientҎ(gu)搜烦排序l果,取出当前中的文id从DB上读取数据?/p>
用户发v搜烦hl由Nut Client构成的集,由某个Nut ClientҎ(gu)搜烦条g查询Cache服务器是否有该缓存,如果有缓存根据缓存的文id直接从DBd数据Q如果没有缓存将查询条g同时发给后面的n台搜索服务器Q搜索服务器搜索结果返回给Nut Client由其排序Q取出当前页文idQ将搜烦条g和当前文id~存Q同时从DBd数据?/p>
4、烦引流E?br /> Hadoop Mapper/Reducer 建立索引。再烦引从HDFS分发到各个烦引服务器?br /> 对烦引的更新分ؓ两种Q删除和dQ更新分解ؓ删除和添加)?br /> a、删?br /> 在HDFS上删除烦引,生成的*.del文g分发到所有的索引服务器上L者对HDFS索引目录删除索引再分发到对应的烦引服务器上去?br /> b、添?br /> 新添加的数据用另一台服务器来生成?br /> 删除和添加步骤可按不同定时策略来实现?/p>
5、Zookeeper服务器状态管理策?br />
假如我们?00份烦引放?00台正在运行中搜烦服务器上Q那么将索引按照如下的方式放在备用中搜烦服务器上Qindex 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台机器中Q?份正在运行中Q?份备份中Q?br />
管q样设计每䆾索引会存?台机器中Q仍然不是绝对安全的。假如运行中的index 1,index 2,index 3同时宕机的话Q那么就会有一份烦引搜索服务无法正启用。那么这栯计,作者认为是在安全性和机器资源两者之间一个比较适合的方案?/p>
备用中的搜烦服务器会定时查运行中搜烦服务器的状态。一旦发C自己索引对应的服务器宕机׃先向zookeeper甌分布式锁Q得到锁的服务器将自己加入到运行中搜烦服务器组Q同时从备用搜烦服务器组中删除自己,q停止运行中搜烦服务器检查服务?br />