一、背景 最近由于项目和论文的需要,需要搭建一个垂直搜索的环境,查阅了很多资料,决定使用Apache的一套解决方案hadoop+hbase+nutch+es。这几样神器的作用就不多作介绍了,自行参考各类百科就行了。我选择这样的方案主要是基于以下考虑: 1、可扩展,虽然
一、背景
最近由于项目和论文的需要,需要搭建一个垂直搜索的环境,查阅了很多资料,决定使用Apache的一套解决方案hadoop+hbase+nutch+es。这几样神器的作用就不多作介绍了,自行参考各类百科就行了。我选择这样的方案主要是基于以下考虑:
1、可扩展,虽然只是实验环境,但是以后在项目中是要应用到生产中的,随着数据量的增大,需要的硬件设备能够方便的加入进来,所以选择了分布式的方案中最具人气的hadoop+hbase组合
2、数据来源兼容,nutch2以后集成了gora和tika,可以方便的进行数据ORM和分析
3、与时俱进,es很火嘛,而且各种评测说es比solr更快更稳定,虽然没有自己测试过,但是跟随github大牛们的脚步总不会错得太离谱
二、前言
这一部分纯粹吐槽,国内的好多技术博客不是停留在nutch1X阶段,就是各种不负责任的抄袭转载,某几位先驱说这几样东西版本必须一对一兼容,然后所有人都这样去做,没有一点探索精神和质疑精神。今天,我就做第一个吃螃蟹的人,谁说gora0.3只能配hbase0.92,谁说nutch2只能配es0.19,既然开源的大牛们放出了稳定最新版,就一定有能兼容的道理!
三、安装与配置过程(伪分布式)
整个实验环境采用伪分布式模式搭建,也就是只有一台master的分布式环境,以后扩展只需要继续配置slaver就可以了。 系统为ubuntu server 12.04
hadoop1.2.1
hadoop安装的前提是java和ssh免密码登陆配置,这个不多说了,基本的,jdk1.6和1.7都可以。
1、官网的stable目录里面下载hadoop1.2.1的deb包
2、安装hadoop的deb包
sudo dpkg -i /home/hadoop/hadoop_1.2.1-1_x86_64.deb
3、查看安装的位置
whereis hadoop
输出:
hadoop: /usr/bin/hadoop /etc/hadoop /usr/etc/hadoop /usr/bin/X11/hadoop /usr/include/hadoop /usr/share/hadoop
这里面/etc/hadoop目录是hadoop的各种配置文件,/usr/share/hadoop则是hadoop的主要jar包和监控页面的东西
4、下面开始修改配置文件:
hdfs-site.xml
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://xieminis.me/configuration.xsl"?><!---ecms -ecms file system properties -->dfs.name.dir/home/hadoop/name<!---ecms -ecms value里填写运行hadoop的账户能够访问的目录 -->dfs.data.dir/home/hadoop/data<!---ecms -ecms value里填写运行hadoop的账户能够访问的目录 -->dfs.replication1Default block replication.The actual number of replications can be specified when the file is created.The default is used if replication is not specified in create time.
mapred-site.xml?
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://xieminis.me/configuration.xsl"?><!---ecms -ecms Put site-specific property overrides in this file. -->mapred.job.trackerlocalhost:54311<!---ecms -ecms 如果是完全分布式模式,localhost要替换为master的内网ip地址,端口随意,注意避开端口冲突 -->The host and port that the MapReduce job tracker runsat. If "local", then jobs are run in-process as a single mapand reduce task.
core-site.xml
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://xieminis.me/configuration.xsl"?><!---ecms -ecms core-site.xml -->hadoop.tmp.dir/home/hadoop/tmpA base for other temporary directories.fs.default.namehdfs://localhost:54310The name of the default file system. A URI whosescheme and authority determine the FileSystem implementation. Theuri's scheme determines the config property (fs.SCHEME.impl) namingthe FileSystem implementation class. The uri's authority is used todetermine the host, port, etc. for a filesystem.
hadoop-env.sh
修改java路径
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
修改pid路径为hadoop运行账户能访问到的路径,默认是/var/run/hadoop,如果不是sudo组的化是没权限的,而且每次重启都会清空这个目录,用chown无法起到长期作用。
export HADOOP_PID_DIR=/home/hadoop/run/hadoopexport HADOOP_SECURE_DN_PID_DIR=/home/hadoop/run/hadoop
masters和slaves
如果是伪分布式,直接localhost,如果是完全分布式,masters填写master的ip地址,slaves填写slave的ip地址,回车隔开
至此基本的配置已经完毕,如果想了解更多配置内容可以参考这篇文章《hadoop三个配置文件的参数含义说明》
5、启动hadoop
先格式化namenode
hadoop?namenode?-format
然后启动
start-all.sh
=============================================
hbase0.94.11
1、官网stable目录下下载hbase0.94.11的tar包并解压
tar -zxvf hbase-0.94.11.tar.gz
2、去conf目录修改hbase-site.xml
hbase.rootdirhdfs://localhost:54310/hbase<!---ecms -ecms 端口号和ip地址要与hadoop配置参数fs.default.name一致 -->hbase.cluster.distributedtruehbase.zookeeper.quorumlocalhost
3、修改hbase-env.sh文件
添加如下三行:
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/export HBASE_CLASSPATH=/etc/hadoopexport HBASE_MANAGES_ZK=true
至此配置文件修改结束(如果完全分布式还要修改regionservers),更多配置参数和调优可以参考这篇文章《HBase入门篇3-hbase 配置文件参数设置及优化》
4、替换hadoop的jar文件
hbase0.94.11默认支持的是hadoop1.0.4,我们可以用替换hadoop-core的方式让其支持hadoop1.2.1
rm?/home/hadoop/hbase-0.94.11/lib/hadoop-core-1.0.4.jarcp?/usr/share/hadoop/hadoop-core-1.2.1.jar?/home/hadoop/hbase-0.94.11/libcp /usr/share/hadoop/lib/commons-collections-3.2.1.jar?/home/hadoop/hbase-0.94.11/libcp /usr/share/hadoop/lib/commons-configuration-1.6.jar?/home/hadoop/hbase-0.94.11/lib
5、启动hbase
/home/hadoop/hbase-0.94.11/bin/start-hbase.sh
6、用jps命令看是否运行正常
输出为:
2032 NameNode13764 HQuorumPeer29069 Jps2630 JobTracker2280 DataNode13889 HMaster2535 SecondaryNameNode2904 TaskTracker14180 HRegionServer
注意这几个东西一个都不能少,如果有什么少了,一定要去日志里看看是怎么回事。
7、尝试运行hbase命令
/home/hadoop/hbase-0.94.11/bin/hbase?shellHBase?Shell;?enter?'help'?for?list?of?supported?commands.Type?"exit"?to?leave?the?HBase?ShellVersion?0.90.4,?r1150278,?Sun?Jul?24?15:53:29?PDT?2011hbase(main):001:0>?listTABLE??????????????????????????????????????????webpage?????????????????????????????????????????1?row(s)?in?0.5270?seconds
如果不报错,说明已经配置成功
?==================================================================
ElasticSearch0.90.5
这里不像一般的博客那样先安装nutch,而是先安装es,为什么,因为逻辑上来讲,nutch是一个爬虫加集成器,es被nutch集成,所以先安装es,这在思想上叫做由零到整。
1、官网下载es0.90.5的deb安装包并安装
sudo dpkg -i /home/hadoop/elasticsearch/elasticsearch-0.90.5.deb
2、查看安装了哪些东西
whereis?elasticsearch
输出:
elasticsearch: /etc/elasticsearch /usr/share/elasticsearch
其中/etc/elasticsearch目录里面的elasticsearch.yml文件是比较重要的配置文件,这里我们使用默认配置,不做修改,需要特殊配置的同学可以参考这篇文章《分布式搜索elasticsearch配置文件详解》。
而/usr/share/elasticsearch里面则是es主要的执行文件和jar包了
3、检查es运行状态
es安装好后就默认开启了,貌似关闭只能杀死进程,启动的话直接输入命令elasticsearch即可。
使用curl来检查es的cluster的运行状态,并获得clustername
curl -XGET 'localhost:9200/_cluster/health?pretty'
如果获得以下输出,表示成功了
{"cluster_name" : "elasticsearch","status" : "green","timed_out" : false,"number_of_nodes" : 2,"number_of_data_nodes" : 2,"active_primary_shards" : 5,"active_shards" : 10,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0}
======================================================================
nutch2.2.1
1、官网下载tar包并解压
2、修改源码
这里要吐槽下nutch的开源大牛们,这么明显的bug你就发出版本来了,而且几个版本都不改,如果你有你的道理,你应该文档说明一下好吧,为毛我都找不到你们的正式说明?
进入src/java/org/apache/nutch/crawl目录,修改GeneratorJob.java中的public Map run(Map args) 方法。
添加以下三行
//?generate?batchId?int?randomSeed?=?Math.abs(new?Random().nextInt()); ??String?batchId?=?(curTime?/?1000)?+?"-"?+?randomSeed; ??getConf().set(BATCH_ID,?batchId); ?
?
如果不这样做,nutch generate的时候会报NullPointerException,真心不知道他们是出于什么目的
?
3、拷贝hbase的配置文件到nutch?
?
cp /home/hadoop/hbase-0.94.11/conf/hbase-site.xml /home/hadoop/nutch2.2.1/conf/?
4、拷贝 hbase0.92 ? 的jar包到nutch的lib目录
这一步是关键,nutch自带的gora0.3是只能支持到最高hbase0.92,默认是hbase0.90,如果不做这一步,nutch就会用默认的0.90jar包去操作0.94的hbase,导致一个“java.lang.IllegalArgumentException: Not a host:port pair”的奇葩错误(据说是低版本client操作高版本server的常见错误)。但是你也不能直接用0.94的jar包去替换,因为这又会导致另一个奇葩错误“java.lang.NoSuchMethodError:org.apache.hadoop.hbase.HColumnDescriptor.setMaxVersions(I)V”,据说这个错误已经被记入HBASE官方JIRA,BUG编号:HBASE-8273。大概意思是说这个setMaxVersions函数的返回值改了。。尼玛,这帮人有没有点面向对象合作编程的常识啊,你丫就不能重新写个函数啊。。。
那么吐槽归吐槽,怎么解决呢,既然大家都说0.92的支持好,那我就用0.92的jar包做替换试试,离0.94就差一个版本,应该不算太低的版本,说不定能操作0.94的库呢,这一试还真成了。
具体办法就是官网上下个hbase0.92.2的版本,把里面的hbase-0.92.2.jar文件拷贝到/home/hadoop/nutch2.2.1/lib目录下即可
?
5、修改nutch-site.xml
?
storage.data.store.classorg.apache.gora.hbase.store.HBaseStoreDefault?class?for?storing?datahttp.agent.nameMozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36<!---ecms -ecms 这个随意填,我填了我chrome浏览器的UA -->
?
关于该文件各个参数的详细解释可以参考这个excel文件——《nutch配置》
?
6、修改ivy/ivy.xml
?
?首先是一个常规的修改,找到
default"?/>
这一行,把注释去掉
?
然后是见证奇迹的修改,让nutch2.2.1支持es0.90.5的修改。找到
default"/>
这一行,把rev的值0.19.4替换为?0.90.5
?
这就是ivy进行包依赖管理的强大之处,一会儿执行ant的时候就是见证奇迹的时刻。
如果不做这一步,在进行nutch elasticindex(建立索引)的时候,会报MasterNotDiscoveredException
?
7、修改conf/gora.properties文件
添加一行:
?
gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
8、执行ant编译
首次执行ant的时候会比较慢,因为ivy要下载依赖包,大家仔细观察屏幕上的输出,可以看到编译到elasticsearch依赖的时候,成功下来了0.90.5的jar包,同时下载的还有lucene4.4.0
执行完成后,会看到nutch目录下多了runtime目录,里面deploy用于分布式抓取,local用于本地抓取
?
至此,所有的安装配置都已完成,enjoy it!
?
?
四、简单体验一下抓取和检索的过程
?
1、建立一个目录urls
2、在urls目录里写一个种子文件,命名为url,里面随便写个页面丰富的网址例如http://blog.tianya.cn
3、将该目录放到hadoop的hdfs上
? ? ?
hadoop fs -copyFromLocal urls /home/hadoop/urls
4、执行nutch inject,向hbase注入抓取种子页
? ??
bin/nutch inject /home/hadoop/urls
执行完成后,可以在hbase里面看到“webpage”这个表
?
5、执行nutch 抓取流程
分别执行以下命令
?
bin/nutch generate -topN 10bin/nutch?fetch?-allbin/nutch?parse?-allbin/nutch?updatedb
执行完成后,可以去hbase里面scan一下webpage表,应该已经有了百行以上的结果
?
6、为elasticsearch建立索引
?
bin/nutch elasticindex -all?
如果没有修本文来源gaodai$ma#com搞$$代**码)网8改过es的配置文件,这里cluster name默认应该是“elasticsearch”
?
7、利用curl进行查询
?
curl -XGET 'http://localhost:9200/_search?content=tianya'
要想进行中文查询,可以自行添加中文分词插件,参考《分布式搜索elasticsearch中文分词集成》
?
?
五、总结
?
这篇博客虽然吐槽较多,但我还是挺尊重一些认真写博客,认真在论坛回答问题的大牛的,能够配置安装成功,也受到了一些大牛博客和大牛回答的启发,在这里要感谢这些无私的人。
?
下面就要在实际的实验和项目中检验我这套配置的合理性和健壮性了,以后博客中,也会多多记录在使用中遇到的问题和解决方法。
?
声明:如未作说明,则本文为 渣滓洞【解旻的博客】 原创。转载务必注明出处。
注意:转载须保留全文,如需修改请联系作者。
本文永久地址:http://xieminis.me/?p=268