(一) hbase+solr概念和环境搭建
概念:
Hadoop实现了一个分布式文件系统(HadoopDistributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据,用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop 项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果;
心得体会:
1. hbase优势:列可以动态添加,比较适合互联网数据,操作简单,提供有hbase api
rest接口,thrift接口等,基于rowkey查询非常快。
2. 可伸缩性强,数据量在无法预估的情况下增大,比如使用mysql,大到一定程度,添加机器,就得使用mysql集群,做分库分表,复杂度增大很多,而hbase只需要简单的添加一台机器就可实现负载均衡。
3. 性能高,少量数据体现不出来他的优势,如果咱们公司爬虫更多,每天入库更多内容,则他的优势会体现出来。
4. 生态系统完备,如果咱们的数据需要做一些分析(hive,),做数据挖掘(mahout),机器学习等,hadoop下提供了很多开源框架,实现了很多优秀算法,使用成本降低,淘宝,中移动,电信等很多大公司都在使用他,说明他的稳定性还是可以的。
5. Solr是基于Lucene的java搜索引擎服务器,封装及扩展性较好,提供了较为完备的解决方案,有高亮提示,solrcloud搭建高可用集群等等优点。
6. 如果有能力公司应该在现有搜索平台的基础上,通过开源方案实现自己的搜索平台,一方面出了问题容易解决,再有就是咱们技术部门的整体技术实力得到提升和锻炼。
问题:
1. 只能基于rowkey查询,不支持条件查询,结合solr可以解决这一问题。
2. 后期开发,维护成本高,没有技术积累,很多问题尚待解决,例如建立数据存储的scheme rowkey设计等,总之,问题是可以解决的,困难是可以逾越的,就看能否坚持下去。
3. solr的字段含义,原理,以及相关概念都不是很熟,由于只是很简单的例子,基本不了解原理,需要时间深入研究,有兴趣的童鞋可以参考文章最后网站学习资料。
1.目的:主要是为了解决cpp全文检索的问题,本周做了一个简单的例子进行技术预研,写成操作笔记,我做的基本上就是搭环境,搭建hadoop,hbase,solr环境等,使用sqoop把cpp的表数据导入hbase中,建立工程调用hbase java api 查找数据添加要索引的doc到solr中,由于时间短,原理以及具体细节需要不是很理解。
2.搭建环境说明:使用的是西安机房的4台服务器搭建,系统版本是linuxredhat 6.4,四台主机的地址是:
其中hadoop集群是一主三从,需要把如下信息配置到linux hosts文件中用了地址解析:
172.22.14.8XAYQ-Test5 #hadoop slave
172.22.14.7XAYQ-Test4 #hadoop slave
172.22.14.6XAYQ-Test3 #hadoop slave
172.22.14.5XAYQ-Test2 #hadoop master,solr服务器地址
hadoop访问界面:http://172.22.14.5:50070/
hbase访问界面:http://172.22.14.5:60010/
sorl服务器访问界面:http://172.22.14.5:8080/solr/#/
3.实现工具说明:使用的是cdh版hadoop,hbase,sqoop,solr等,下载地址:http://www.cloudera.com/content/support/en/downloads/cdh/cdh-5-1-0.html
相应版本如下:
/opt/software/hadoop-2.3.0-cdh5.0.3.tar.gz
/opt/software/hbase-0.96.1.1-cdh5.0.3.tar.gz
/opt/software/hbase-solr-1.3-cdh5.0.3.tar.gz
/opt/software/solr-4.4.0-cdh5.0.3.tar.gz
/opt/software/zookeeper-3.4.5-cdh5.0.3.tar.gz
4.操作步骤如下:
搭建hadoop环境: 可以使用ambari hadoop管理平台搭建,也可以下载安装包一个一个安装,我使用的是如上安装包搭建的:
1.解压相应安装包到/opt/cdh5下:
[root@XAYQ-Test3~]# ll /opt/cdh5/
总用量 24
drwxr-xr-x.15 root root 4096 7月 16 12:42 hadoop-2.3.0
drwxr-xr-x.24 root root 4096 7月 16 17:25 hbase-0.96
drwxr-xr-x.17 root root 4096 7月 16 09:07 hbase-solr-1.3
drwxr-xr-x.11 root root 4096 7月 16 09:07 solr-4.4.0
drwxr-xr-x.20 root root 4096 7月 17 13:52 sqoop2-1.99.3
drwxr-xr-x.14 root root 4096 7月 16 09:07 zookeeper-3.4.5
2.配置如上目录以及javajdk到环境变量中:
[root@XAYQ-Test3 cdh5]# vi /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_60 exportPATH=$JAVA_HOME/bin:$PATH exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar exportHADOOP_HOME=/opt/cdh5/hadoop-2.3.0 exportHBASE_HOME=/opt/cdh5/hbase-0.96 exportZOOKEEPER_HOME=/opt/cdh5/zookeeper-3.4.5 exportSQOOP_HOME=/opt/cdh5/sqoop2-1.99.3 exportSOLR_HOME=/opt/cdh5/solr-4.4.0 exportHBASE_SOLR_HOME=/opt/cdh5/hbase-solr-1.3 exportPATH=${SQOOP_HOME}/bin:${HADOOP_HOME}/bin:${HBASE_HOME}/bin:${ZOOKEEPER_HOME}/bin:${SOLR_HOME}/bin:${HBASE_SOLR_HOME}/bin:$PATH
3.配置hadoop,注意如下配置只是针对如上版本,不同版本配置参数可能不同:
hadoop配置文件均在/opt/cdh5/hadoop-2.3.0/etc/hadoop/ 目录,修改core-site.xml文件,具体参数可以自行查资料
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://XAYQ-Test2:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/hadoop/tmp</value> </property> <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property> </configuration>
修改hdfs-site.xml文件,定义了hdfs的数据目录,和名字目录,具体含义可以网上查。
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>XAYQ-Test2:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
修改yarn-site.xml,定义了yarn相关参数
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>XAYQ-Test2:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>XAYQ-Test2:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>XAYQ-Test2:8034</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>XAYQ-Test2:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>XAYQ-Test2:8088</value> </property> </configuration>
配置hadoop主从关系:
masters文件添加master机器节点:XAYQ-Test2
slaves文件添加slave机器节点:
XAYQ-Test5 XAYQ-Test4 XAYQ-Test3
4.配置hbase,hbase配置文件均在/opt/cdh5/hbase-0.96/conf目录下:
修改hdfs-site.xml,添加如下信息
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>XAYQ-Test2:9001</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
修改regionservers,添加hbase 从机节点:
XAYQ-Test3 XAYQ-Test4 XAYQ-Test5
修改完成后把hadoop,hbase 目录安装目录复制到其他几个节点上。
然后可以在任意节点启动hadoop集群,如果没有问题启动hbase集群:
启动正常的情况下进程信息如下:
master机进程:
[root@XAYQ-Test2lib]# jps 2833SecondaryNameNode #hadoop进程 35762HMaster #hbase进程 2563NameNode #hadoop进程 3073ResourceManager #hbase进程
slave机进程:
[root@XAYQ-Test3cdh5]# jps 16557DataNode 10295HRegionServer 16724NodeManager 10120HQuorumPeer
遇到的问题: 开始使用贾慧磊提到的ambrai,是hadoop的管理平台,安装成功后,进行
5.安装solr:
下载一个tomcat,解压到一个目录下把cdh版solr目录下dist 目录下solr 相应的war包放置到tomcat webapps下:
修改solr的web.xml,添加如下内容,其中solr/home,是sorl包下example目录下的solr目录,
把solr 目录下的jar拷贝到/opt/apache-tomcat-6.0.36/webapps/solr/WEB-INF/lib目录下。
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/opt/cdh5/solr-4.4.0/example/solr</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
配置分词器:有好几款功能强大的分词器,ik,mmseg4j,smartcn等,我使用solr自带的smartcn分词器,
进入solr home目录下:/opt/cdh5/solr-4.4.0/example/solr/collection1/conf下:
修改schema.xml,添加如下内容:
<p> <fieldType name="text_smart"class="solr.TextField" positionIncrementGap="100"></p><p> <analyzer type="index"></p><p> <!-- 此处需要配置主要的分词类 --></p><p> <tokenizerclass="solr.SmartChineseSentenceTokenizerFactory"/> </p><p> <filterclass="solr.SmartChineseWordTokenFilterFactory"/></p><p> </analyzer></p><p> <analyzer type="query"></p><p> <!-- 此处配置同上 --></p><tokenizerclass="solr.SmartChineseSentenceTokenizerFactory"/> <filterclass="solr.SmartChineseWordTokenFilterFactory"/> </analyzer> </fieldType>
添加如下字段测试分词功能:访问http://172.22.14.5:8080/solr/#/collection1/analysis,输入一段中文:点击解析查看分词效果。
<fieldname="sma" type="text_smart" indexed="true"stored="true" multiValued="true"/>
Solr管理界面:
至此,环境搭建ok了,中间遇到很多问题,通过日志定位,网上查找资料解决。
6.把cpp表数据导入hbase中,现成的工具是hadoop生态系统下sqoop,顾名思义sql tohadoop。
有两个版本,sqoop1和sqoop2,差异比较大,sqoop2使用cs架构,配置好启动起来,客户端不能创建到mysql的链接,解决不了,
只好使用sqoop1,直接调用即可,有几张测试数据是从104cpp导入的,后来从西安机房测试环境上cpp库导入一张表到hbase中。
进入sqoop bin目录,运行如下命令:
./sqoop import --driver com.mysql.jdbc.Driver--connect "jdbc:mysql://172.22.14.7:3306/cpp" --table CMSDOCUMENT(数据库表名) --username root --password root --hbase-tableCMSDOCUMENT(导入hbase表名) --column-family document --hbase-row-key DOCID(hbase指定的rowkey)--hbase-create-table
可以进入hbase shell中查看导入的结果:
# hbase shell。
# list #命令查看表信息。
# describe '表名' #查看表结构
# scan '表名'; #查看表数据信息。
7.把hbase需要检索的内容导入solr中,有两种方式把hbase导入solr,第一种使用mapreduce效率高,第二种使用javaapi
使用hbase api查询hbase表结构信息,调用sorl的http请求,添加document到solr中。
新建一个过程,添加config.properties配置文件,加入如下内容:
HBASE_ZOOKEEPER_QUORUM=XAYQ-Test3,XAYQ-Test4,XAYQ-Test5 HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT=2181 HBASE_MASTER=XAYQ-Test2:60020 HBASE_ROOTDIR=hdfs://XAYQ-Test2:9000/hbase/ DFS_NAME_DIR=/hadoop/dfs/name DFS_DATA_DIR=/hadoop/dfs/data FS_DEFAULT_NAME=hdfs://172.22.14.5:9000 SOLR_SERVER=http://172.22.14.5:8080/solr HBASE_TABLE_NAME=CMSDOCUMENT HBASE_TABLE_FAMILY=document
具体测试代码如下,添加所有依赖包,打包扔到测试环境上运行:
public static void main(String[] args1) throwsIOException, SolrServerException { ConfigProperties tutorialProperties = new ConfigProperties(args[0]); String tbName = tutorialProperties.getHBTbName(); String tbFamily = tutorialProperties.getHBFamily(); System.out.println("tbName ===="+tbName); System.out.println("tbFamily ===="+tbFamily); HttpSolrServer solrServer = newHttpSolrServer("http://172.22.14.5:8080/solr"); Configuration conf = HBaseConfiguration.create(); System.out.println("hbase.zookeeper.quorum==="+tutorialProperties.getZKQuorum()); conf.set("hbase.zookeeper.quorum",tutorialProperties.getZKQuorum()); conf.set("hbase.zookeeper.property.clientPort", tutorialProperties.getZKPort()); System.out.println("hbase.zookeeper.property.clientPort==="+tutorialProperties.getZKPort()); conf.set("hbase.master", tutorialProperties.getHBMaster()); conf.set("hbase.rootdir", tutorialProperties.getHBrootDir()); conf.set("solr.server", tutorialProperties.getSolrServer()); HTable table = new HTable(conf, tbName); // 这里指定HBase表名称 Scan scan = new Scan(); scan.addFamily(Bytes.toBytes(tbFamily)); // 这里指定HBase表的列族 scan.setCaching(500); scan.setCacheBlocks(false); ResultScanner ss = table.getScanner(scan); System.out.println("start ..."); int i = 0; try { for (Result r : ss) { SolrInputDocument solrDoc = newSolrInputDocument(); for (KeyValue kv : r.raw()) { String fieldName = newString(kv.getQualifier()); String fieldValue = newString(kv.getValue()); if(fieldName.equals("DOCHASHCODE")) { solrDoc.addField("id", new String(r.getRow()) +fieldValue); } if(fieldName.equalsIgnoreCase("DOCCONTENT")) { solrDoc.addField("content",fieldValue); } } solrServer.add(solrDoc); solrServer.commit(true, true,true); i = i + 1; System.out.println("已经成功处理 "+ i + " 条数据"); } ss.close(); table.close(); System.out.println("done !"); } catch (IOException e) { } finally { ss.close(); table.close(); System.out.println("erro !"); } }
8.访问solr 调用搜索接口:http://172.22.14.5:8080/solr/select?q=%E6%AC%A7%E4%BA%9A&hl=on,测试用,
大家可以访问这个地址测试http://172.22.14.5:8080/solr/select?q=""自行测试,由于只用了几天时间去搭建测试,还不是很了解solr的原理以及很多细节,需要了解的可以网上查找资料了解。
参考文章:
http://www.chepoo.com/solrcloud-introduction.html
http://www.solrcn.com/?cat=1
http://www.dataguru.cn/article-3815-1.html
http://blog.csdn.net/awj3584/article/details/16963525
http://wenku.baidu.com/link?url=TSV_Uf0irJGn6msFYL6egVYTShtaJJNlYwQdSjhyuMfA8auRdsF4lWT9Q17rdOrkTj0o2t1S7gvGOPU36XUgw4WSpviUIeuE0QkbKvQ3XGq
http://blog.csdn.net/huoyunshen88/article/details/37927623
http://blog.csdn.net/huoyunshen88/article/details/17714317
http://blog.csdn.net/huoyunshen88/article/details/17922625