Hbase二级索引方案概述在Hbase中,表的RowKey按照字典排序,Region按照RowKey设置splitpoint进行shard,通过这种方式实现的全局、分布式索引.成为了其成功的最大的砝码。然而单一的通过RowKey检索数据的方式,不再满足更多的需求,查询成为Hbase的瓶颈,人们更加希望像Sql一样快速检索数据,可是,Hbase之前定位的是大表的存储,要进行这样的查询,往往是要通过类似Hive、Pig等系统进行全表的MapReduce计算,这种方式既浪费了机器的计算资源,又因高延迟使得应用黯然失色。于是,针对HBaseSecondaryIndexing的方案出现了。SolrSolr是一个独立的企业级搜索应用服务器,是ApacheLucene项目的开源企业搜索平台,其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr4还增加了NoSQL支持,以及基于Zookeeper的分布式扩展功能SolrCloud。SolrCloud的说明可以参看:SolrCloud分布式部署。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。Solr可以高亮显示搜索结果,通过索引复制来提高可用,性,提供一套强大DataSchema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。Key-ValueStoreIndexer这个组件非常关键,是Hbase到Solr生成索引的中间工具。在CDH5.3.2中的Key-ValueIndexer使用的是LilyHBaseNRTIndexer服务.LilyHBaseIndexer是一款灵活的、可扩展的、高容错的、事务性的,并且近实时的处理HBase列索引数据的分布式服务软件。它是NGDATA公司开发的Lily系统的一部分,已开放源代码。LilyHBaseIndexer使用SolrCloud来存储HBase的索引数据,当HBase执行写入、更新或删除操作时,Indexer通过HBase的replication功能来把这些操作抽象成一系列的Event事件,并用来保证写入Solr中的HBase索引数据的一致性。并且Indexer支持用户自定义的抽取,转换规则来索引HBase列数据。Solr搜索结果会包含用户自定义的columnfamily:qualifier字段结果,这样应用程序就可以直接访问HBase的列数据。而且Indexer索引和搜索不会影响HBase运行的稳定性和HBase数据写入的吞吐量,因为索引和搜索过程是完全分开并且异步的。LilyHBaseIndexer在CDH5中运行必须依赖HBase、SolrCloud和Zookeeper服务。实时查询方案Hbase-----KeyValueStore---Solr-------Web前端实时查询展示1.Hbase提供海量数据存储2.Solr提供索引构建与查询3.KeyValueStore提供自动化索引构建(从Hbase到Solr)使用流程前提:CDH5.3.2Solr集群搭建好,CDH5.3.2Key-ValueStoreIndexer集群搭建好1.开启Hbase的复制功能2.Hbase表需要开启REPLICATION复制功能create'table',{NAME='cf',REPLICATION_SCOPE=1}#其中1表示开启replication功能,0表示不开启,默认为0对于已经创建的表可以使用如下命令disable'table'alter'table',{NAME='cf',REPLICATION_SCOPE=1}enable'table'3.生成实体配置文件,/opt/hbase-indexer/Test是自定义路径,可以自己设置solrctlinstancedir--generate/opt/cdhsolr/waslog4.编辑生成好的scheme.xml文件把hbase表中需要索引的列添加到scheme.xmlfiled节点,其中的name属性值要与Morphline.conf文件中的outputField属性值对应5.创建collection实例并配置文件上传到zookeeper,命令solrctlinstancedir--createwaslog/opt/cdhsor/waslog6.上传到zookeeper之后,其他节点就可以从zookeeper下载配置文件。接下来创建collection,命令:solrctlcollection–createwaslog-s15–r2–m507.创建LilyHBaseIndexer配置文件morphline-hbase-mapper.xml?xmlversion=1.0encoding=UTF-8?indexertable=waslogmapper=com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapperparamname=morphlineFilevalue=morphlines.conf/paramparamname=morphlineIdvalue=wasMap/param/indexer其中morphlineId的value是对应Key-ValueStoreIndexer中配置文件Morphlines.conf中morphlines属性id值8.修改Morphlines文件,具体操作:进入Key-ValueStoreIndexer面板-配置-查看和编辑-属性-Morphline文件,morphlines:[{id:waslogMapimportCommands:[org.kitesdk.**,com.ngdata.**]commands:[{extractHBaseCells{mappings:[{inputColumn:cf:LOGSYFGoutputField:LOGSYFGtype:stringsource:value},{inputColumn:cf:LOGIPADoutputField:LOGIPADtype:stringsource:value},{inputColumn:cf:LOGSEQCoutputField:LOGSEQCtype:stringsource:value},{inputColumn:cf:LOGLGDToutputField:LOGLGDTtype:stringsource:value},{inputColumn:cf:LOGLGTMoutputField:LOGLGTMtype:stringsource:value}]}}{logDebug{format:outputrecord:{},args:[@{}]}}]}]inputColumn:Hbase的CLOUMNoutputField:Solr的Schema.XML配置的fields9.注册LilyHBaseIndexerconfiguration和LilyHbaseIndexerServicehbase-indexeradd-indexer\--namecloudIndexer\--indexer-conf/opt/cdhsolr/morphline-hbase-mapper.xml--connection-paramsolr.zk=cdh1:2181,cdh2:2181,cdh3:2181/solr\--connection-paramsolr.collection=waslog\--zookeepercdh1:2181,cdh2:2181,cdh3:2181验证索引器是否成功创建hbase-indexerlist-indexers10.测试put数据查看结果当写入数据后,稍过几秒我们可以在相对于的solr中查询到该插入的数据,表明配置已经成功。11.使用IK分词器在/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF创建classes目录把IKAnalyzer.cfg.xml和stopword.dic添加到classes目录把IKAnalyzer2012FF_u1.jar添加到/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib目录在Schema.xml中添加!--配置IK分词器--fieldTypename=text_ikclass=solr.TextField!--索引时候的分词器--analyzertype=indexisMaxWordLength=falseclass=org.wltea.analyzer.lucene.IKAnalyzer/!--查询时候的分词器--analyzertype=queryisMaxWordLength=trueclass=org.wltea.analyzer.lucene.IKAnalyzer//fieldType配置好后更新ZK配置文件,重启solr服务12,扩展命令Scheme.xml新增索引字段执行以下命令更新配置solrctlinstancedir--updatewaslog/opt/cdhsolr/waslogsolrctlcollection--reloadwaslog查看collection命令:solrctlcollection–listHbase表数据到SOLR集群迁移在CDH5.3.2中Hbase-indexer提供了MapReduce来批量构建索引的方式/opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.3.2-job.jar构建命令hadoopjar/opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.3.2-job.jarD'mapreduce.reduce.shuffle.memory.limit.percent=0.06'--hbase-indexer-file/opt/cdhsolr/mapping/waslog/morphline-hbase-mapper.xml--zk-hosthadoop03:2181,hadoop04:2181,hadoop05:2181/solr--collectionwaslog--go-live注意:在运行命令的目录下必须有morphlines.conf文件