CDH使用Solr实现HBase二级索引

一、为什么要使用Solr做二级索引

在Hbase中,表的RowKey 按照字典排序, Region按照RowKey设置split point进行shard,通过这种方式实现的全局、分布式索引. 成为了其成功的最大的砝码。

然而单一的通过RowKey检索数据的方式,不再满足更多的需求,查询成为Hbase的瓶颈,人们更加希望像Sql一样快速检索数据,可是,Hbase之前定位的是大表的存储,要进行这样的查询,往往是要通过类似Hive、Pig等系统进行全表的MapReduce计算,这种方式既浪费了机器的计算资源,又因高延迟使得应用黯然失色。于是,针对HBase Secondary Indexing的方案出现了。

Solr

Solr是一个独立的企业级搜索应用服务器,是Apache Lucene项目的开源企业搜索平台,

其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr 4还增加了NoSQL支持,以及基于Zookeeper的分布式扩展功能SolrCloud。SolrCloud的说明可以参看:SolrCloud分布式部署。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

Solr可以高亮显示搜索结果,通过索引复制来提高可用,性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

Key-Value Store Indexer

这个组件非常关键,是Hbase到Solr生成索引的中间工具。

在CDH5.3.2中的Key-Value Indexer使用的是Lily HBase NRT Indexer服务.

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 —–> Key Value Store —> Solr ——-> Web前端实时查询展示

1.Hbase 提供海量数据存储
2.Solr提供索引构建与查询
3. Key Value Store 提供自动化索引构建(从Hbase到Solr)
CDH使用Solr实现HBase二级索引_第1张图片

三、部署流程

3.1 安装HBase、Solr

CDH使用Solr实现HBase二级索引_第2张图片

3.2 增加HBase复制功能

默认安装了Key-Value Store Indexer之后就会打开HBase的复制功能
CDH使用Solr实现HBase二级索引_第3张图片
接下来就是对HBase得表进行改造了
对于初次建立得表,可以使用

#其中1表示开启replication功能,0表示不开启,默认为0
create 'zgpf_test',{NAME =>'data',VERSIONS => 3, REPLICATION_SCOPE =>1}

#对于已经存在得表,可以
disable 'tableName'
alter 'tableName',{NAME =>'data', REPLICATION_SCOPE =>1}
enable 'tableName'

#这里,为了测试,我新建一张表,名字叫做
create 'zgpf_test',{NAME => 'data', REPLICATION_SCOPE => 1} 

#并插入两条数据
put 'zgpf_test','001','data:name','gpf'
put 'zgpf_test','001','data:age','18'

3.3创建相应的 SolrCloud 集合

接下来在安装有Solr的机器上运行
这里得路径和用户名都可以自己定义

#生成实体配置文件:
solrctl instancedir --generate /opt/webserver/bi/solr/hbase-indexer/gpf/

此时会在home下生成hbase-indexer/bqjr文件夹,里面包含一个conf文件夹,我们修改下面得schema.xml文件.
我们新建一个filed字段

vi /opt/webserver/bi/solr/hbase-indexer/gpf/conf/schema.xml
 
 

这里重点解释一下name字段,它对应了我们后续需要修改Morphline.conf文件中的outputField属性。因此可以看成是hbase中需要创建索引的值。因此我们建议将其与表名和列族结合。

Hbase Solr
name zgpf_test_data_name
age zgpf_test_data_age

再修改solrconfig.xml文件,将硬提交打开(会影响部分性能)

vi /opt/webserver/bi/solr/hbase-indexer/gpf/conf/solrconfig.xml

autoCommit:数据刷新到磁盘 每隔10s
autoSoftCommit:数据刷新到内存 每隔1s

     <autoCommit>
       <maxTime>${solr.autoCommit.maxTime:10000}maxTime>
       <openSearcher>trueopenSearcher>
     autoCommit>

     <autoSoftCommit>
       <maxTime>${solr.autoSoftCommit.maxTime:1000}maxTime>
     autoSoftCommit>

执行

# 创建 collection实例并将配置文件上传到 zookeeper:
solrctl instancedir --create gpf /opt/webserver/bi/solr/hbase-indexer/gpf/

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

# 如果希望将数据分散到各个节点进行存储和检索,则需要创建多个shard,需要使用如下命令
# 其中-s表示设置Shard数为7,-r表示设置的replica数为3,-m表示最大shards数目(7*3)
solrctl collection --create gpf -s 7 -r 3 -m 21

创建完后效果:
CDH使用Solr实现HBase二级索引_第4张图片

3.4 设置Indexer Lily HBase Indexer

在 /opt/webserver/bi/solr/hbase-indexer/gpf/ 下创建 morphline-hbase-mapper.xml

vi /opt/webserver/bi/solr/hbase-indexer/gpf/morphline-hbase-mapper.xml

  <indexer table="zgpf_test">
    <field name="zgpf_test_data_name" value="data:name" type="string"/>
    <field name="zgpf_test_data_age" value="data:age" type="string"/>
  indexer>

当 Lily HBase Indexer 配置 XML文件的内容令人满意,将它注册到 Lily HBase Indexer Service。上传 Lily HBase Indexer 配置 XML文件至 ZooKeeper,由给定的 SolrCloud 集合完成此操作。

hbase-indexer add-indexer -n gpfIndexer \
-c /opt/webserver/bi/solr/hbase-indexer/gpf/morphline-hbase-mapper.xml \
-cp solr.zk=test-cdh2:2181,test-cdh3:2181/solr -cp solr.collection=gpf

至此三个组件之间全部配置完

3.5 同步数据

put 'zgpf_test','002','data:name','lzb'
put 'zgpf_test','002','data:age','48'

此时我们在solr界面可以查询
CDH使用Solr实现HBase二级索引_第5张图片

圆满完成

4.1 批量同步索引

仔细观察3.5我们会发现一个问题,我们只记录了后面插入得数据,那原来就存在HBase的数据怎么办呢?
执行下面的命令

#批量添加索引
hadoop jar /usr/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.10.0-job.jar \
    --hbase-indexer-zk test-cdh2:2181,test-cdh3:2181 \
    --hbase-indexer-name gpfIndexer \
    --reducers 0

#通过为--reducers参数提供-1或正整数,也可以在HDFS中生成脱机索引分片,如下所示:
hadoop jar hbase-indexer-mr-*-job.jar \
    --hbase-indexer-zk test-cdh2:2181,test-cdh3:2181 \
    --hbase-indexer-name gpfIndexer \
    --reducers -1 \
    --output-dir hdfs://namenode/solroutput

#最后,索引分片可以离线生成,然后使用--go-live标志合并到正在运行的SolrCloud集群中,如下所示:
hadoop jar /usr/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.10.0-job.jar \
    --hbase-indexer-zk test-cdh2:2181,test-cdh3:2181 \
    --hbase-indexer-name gpfIndexer \
    --go-live

同步完之后,在查看solr
CDH使用Solr实现HBase二级索引_第6张图片

五、 扩展命令

#solrctl
solrctl instancedir --list
solrctl collection --list

# 更新coolection配置
solrctl instancedir --update User $HOME/hbase-indexer/User
solrctl collection --reload User

#删除instancedir
solrctl instancedir --deleteUser

#删除collection
solrctl collection --deleteUser

#删除collection所有doc
solrctl collection --deletedocs User

#删除User配置目录
rm -rf $HOME/hbase-indexer/User

# hbase-indexer
# 若修改了morphline-hbase-mapper.xml,需更新索引
hbase-indexer update-indexer -n userIndexer

# 删除索引
hbase-indexer delete-indexer -n userIndexer

#查看索引
hbase-indexer list-indexers

你可能感兴趣的:(hbase)