(一) hbase+solr概念和环境搭建

(一) 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

 

 

 

你可能感兴趣的:((一) hbase+solr概念和环境搭建)