HBase+Solr 的 二级索引 实时查询

零、概述

1.Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页、查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase Secondary Indexing),供复杂查询使用

2.Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。(web 8983端口

3.Key-Value Store IndexerHbase到Solr生成索引的中间工具。在CDH5中的Key-Value Store Indexer使用的是Lily HBase NRT Indexer服务

4.Lily HBase Indexer是一款灵活的、可扩展的、高容错的、事务性的,并且近实时的处理HBase列索引数据的分布式服务软件。它是NGDATA公司开发的Lily系统的一部分,已开放源代码。Lily HBase Indexer使用SolrCloud来存储HBase的索引数据,当HBase执行写入、更新或删除操作时,Indexer通过HBase的replication功能来把这些操作抽象成一系列的Event事件,并用来保证写入Solr中的HBase索引数据的一致性。并且Indexer支持用户自定义的抽取,转换规则来索引HBase列数据。Solr搜索结果会包含用户自定义的columnfamily:qualifier字段结果,这样应用程序就可以直接访问HBase的列数据。而且Indexer索引和搜索不会影响HBase运行的稳定性和HBase数据写入的吞吐量,因为索引和搜索过程是完全分开并且异步的。Lily HBase Indexer在CDH5中运行必须依赖HBase、SolrCloud和Zookeeper服务。

一、修改hbase 可复制

disable 'syslog'

alter 'syslog',{NAME =>'cf', REPLICATION_SCOPE =>1}

enable 'syslog'

二、生成实体配置文件:

solrctl instancedir --generate /opt/cdhsolr/syslog

①vi  /opt/cdhsolr/syslog/conf/schema.xml

添加

[tablename]_[family]_[field]"type="string"indexed="true"stored="true"/>

 

 

创建 collection实例并将配置文件上传到 zookeeper

solrctl instancedir --create syslog /opt/cdhsolr/syslog

上传到 zookeeper 之后,其他节点就可以从zookeeper下载配置文件。接下来创建 collection:

solrctl collection --create syslog

(-s是6个分片(shard),我们的solrclound是6台机器,-r是2个副本(replication),-c是指定zk上solr/configs节点下使用的配置文件名称,-a是允许添加副本(必须写,否则创建不了副本),-m 默认值是1,注意三个数值:numShards、replicationFactor、liveSolrNode,一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件: numShards*replicationFactor)

三、创建 Lily HBase Indexer 配置

1. 在前面定义的/opt/cdhsolr/syslog目录下,创建一个morphline-hbase-mapper.xml文件,内容如下:

table="syslog" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">

 

 value="syslogMap">

四、创建 Morphline 配置文件

通过CM页面进入到Key-Value Store Indexer的配置页面,里面有一个Morphlines文件。我们编辑它 每个Collection对应一个morphline-hbase-mapper.xml 

 

SOLR_LOCATOR : {

  # Name of solr collection

  collection : syslog

  

  # ZooKeeper ensemble

  zkHost : "$ZK_HOST"

}

 

 

morphlines : [

{

id : syslogMap

importCommands : ["org.kitesdk.**", "com.ngdata.**"]

 

commands : [                    

  {

    extractHBaseCells {

      mappings : [

        {

inputColumn :"info:req_chan"

outputField :"syslog_info_req_chan"

type :string

source : value

},

{

inputColumn :"info:req_path"

outputField :"syslog_info_req_path"

type :string

source : value

},

{

inputColumn :"info:req_ts"

outputField :"syslog_info_req_ts"

type :string

source : value

}

      ]

    }

  }

  { logDebug { format : "output record: {}", args : ["@{}"] } }

]

}

]

 

其中

id:表示当前morphlines文件的ID名称。

importCommands:需要引入的命令包地址。

extractHBaseCells:该命令用来读取HBase列数据并写入到SolrInputDocument对象中,该命令必须包含零个或者多个mappings命令对象

mappings:用来指定HBase列限定符的字段映射

inputColumn:需要写入到solr中的HBase列字段。值包含列族和列限定符,并用‘ : ’分开。其中列限定符也可以使用通配符‘’来表示,譬如可以使用data:表示读取只要列族为data的所有hbase列数据,也可以通过data:my*来表示读取列族为data列限定符已my开头的字段值。

outputField:用来表示morphline读取的记录需要输出的数据字段名称,该名称必须和solr中的schema.xml文件的字段名称保持一致,否则写入不正确。

type:用来定义读取HBase数据的数据类型,我们知道HBase中的数据都是以byte[]的形式保存,但是所有的内容在Solr中索引为text形式,所以需要一个方法来把byte[]类型转换为实际的数据类型。type参数的值就是用来做这件事情的。现在支持的数据类型有:byte,int,long,string,boolean,float,double,short和bigdecimal。当然你也可以指定自定的数据类型,只需要实现com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口即可。

source:用来指定HBase的KeyValue那一部分作为索引输入数据,可选的有‘value’和'qualifier',当为value的时候表示使用HBase的列值作为索引输入,当为qualifier的时候表示使用HBase的列限定符作为索引输入。

五、注册 Lily HBase Indexer Configuration Lily HBase Indexer Service

hbase-indexer add-indexer \

-n syslogIndexer \

-c /opt/cloudera/parcels/CDH/lib/hbase-solr/morphline-hbase-mapper-syslo g.xml \

--connection-param solr.zk=n1:2181/solr \

--connection-param solr.collection=syslog \

--zookeeper n1:2181

 

 

**-n表示indexer的名称,-c表示加载的indexer的配置文件名称,–connection-param表示连接的solr的zk地址和对应的collection名称,–zookeeper表示indexer要上传到的zk地址。**

 

hbase-indexer list-indexers --zookeeper n1:2181 查询

 

六、同步

全量同步,由于是新加入的集群,需要第一次做全量同步,然后任务会自动增量同步,执行这个命令需要切换到hdfs用户下。

(复制出现问题 手敲可行)

hadoop --config /etc/hadoop/conf jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-*-job.jar --conf /etc/hbase/conf/hbase-site.xml -D 'mapred.child.java.opts=-Xmx 1000m' --hbase-indexer-file /opt/cloudera/parcels/CDH/lib/hbase-solr/morphline-hbase-mapper-syslog.xml --zk-host n1:2181/solr --collection syslog --reducers 0

$**$在运行命令的目录下必须有morphlines.conf文件,执行 
find / |grep morphlines.conf$

x选择最新的文件  组成一个命令

--morphline-file /opt/cloudera-manager/cm-5.7.0/run/cloudera-scm-agent/process/213-ks_indexer-HBASE_INDEXER/morphlines.conf

Xxxxx

 

组成新的语句:

hadoop --config /etc/hadoop/conf jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-*-job.jar --conf /etc/hbase/conf/hbase-site.xml -D 'mapred.child.java.opts=-Xmx 1000m' --hbase-indexer-file /opt/cloudera/parcels/CDH/lib/hbase-solr/morphline-hbase-mapper-syslog.xml --morphline-file /opt/cloudera-manager/cm-5.7.0/run/cloudera-scm-agent/process/213-ks_indexer-HBASE_INDEXER/morphlines.conf --zk-host n1:2181/solr --collection syslog --reducers 0

 

你可能感兴趣的:(HBase+Solr,二级索引)