基于cdh5.7.5集群的solr(4.10.3-cdh5.7.5)+hbase(1.2.0-cdh5.7.5)构建二级索引方案
程序员文章站
2022-06-16 08:10:00
...
简述
作为开发人员,在阅读该篇博客之前最好已具备以下基本技能:
了解Linux命令、HBase Shell、Solr schema.xml文件的常用的标签含义、CDH集群基本操作(所需服务安装、卸载、配置)
HBASE
在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)
方案具体实施流程
前提:
CDH5.7.6 Zookeeper集群已搭建
CDH5.7.6 HBase集群已搭建
CDH5.7.6 Solr集群已搭建
CDH5.7.6 Key-Value Store Indexer集群已搭建
推荐clouderamanager(简称CM)来管理集群
接下来,开始我们的方案实施:
第一步:
开启Hbase的复制功能
解释:
通过CM界面修改HBase配置,勾上启用复制、启用编制索引,其余项设置默认值即可
第二步:
通过Linux终端,进入HBase Shell,输入命令,开启HBase表的复制功能
解释:
命令:
# 1 表示开启replicaiton功能,默认为0,不开启
对于已经创建的表可以使用以下命令:
第三步:
生成实体配置文件
解释:
执行命令:
第四步:
编辑生成好的schema.xml文件
解释:
schema.xml文件在上一步指定的路径下的conf文件夹中
当前步,将hbase表中需要索引的列添加到schema.xml中,添加field节点,
注意:field节点的name属性值要与下面定义的Morphline.conf文件中的
outputField属性值对应
例:
第五步:
创建collection实例并将实体配置文件上传到zk
解释:
执行命令:
注意:如果报错,查看具体报错原因,然后百度或者谷歌,有些时候的错误是因为
个人的粗心大意或者集群配置有问题,多多注意,对待技术要严谨
如果修改了/opt/cdhsolr/fuser/conf下的schema.xml文件,需要重新上传加载,执行如下命令:
第六步:
配置文件上传到zk上了,其他节点就可以从zk上下载配置文件。接下来创建solr分片
解释:
执行命令:
命令解释:
创建solr分片时,要根据实际情况定s(shard)、r(replication),m(maxShardsPerNode),否则报错
其中-s是3个分片(shard),我们的solrclound是3台机器,-r是1个副本(replication),-c是指定zk上solr/configs节点下使用的配置文件名称,-a是允许添加副本(必须写,否则创建不了副本),-m 默认值是1,注意三个数值:numShards、replicationFactor、liveSolrNode,一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件:
numShards*replicationFactor<liveSolrNode*maxShardsPerNode
以上命令可以简化,如下:
第七步:
创建Lily HBase Indexer 配置文件 morphline-hbase-mapper.xml
解释:
morphlines.conf文件需要在集群每台机器下同一个目录文件下,文件内容如下:
本例这两个文件均放在:/opt/cdhsolr 文件夹下,文件名分别为:morphline-hbase-mapper.xml和 morphlines.conf
第九步:
注册Lily HBase Indexer Configuration 和 Lily HBase Indexer service
解释:
执行命令:(具体命令查看帮助 hbase-indexer --help,此命令中的 斜杠 是linux中对过长的命令进行换行的操作)
命令执行结束后,检验索引器是否创建成功
执行如下命令:
执行结果:当看到当前创建的 fuserIndexer 下面显示 +0 failed processes 则代表索引创建并执行成功
如果所引起需要重建,删除使用下列方法,如果删除不了,始终在删除中的死循环中,就需到zk上手动删除节点信息: ls /ngdata/hbaseindexer 下
第十步:
测试put数据查看结果
解释:
进入hbase shell,往先前创建的 table 中 put 数据,等几秒,我们就可以在相对的solr中查询到该插入的数据,表明配置成功。
第十一步:
使用IK分词器,应为该集群使用到的solr版本为4.10.3-cdh5.7.5,所以使用的 IK 包为IKAnalyzer2012FF_u1.jar,如果是3x的solr,使用IKAnalyzer2012_u6.jar
具体操作如下:
到此就结束了,整个方案实施过程中不免会存在各种各样小问题,相信自己,只要多和身边人交流,总能成功的。(PS:小鸟一枚,也是在同事的帮助下,花了近一天的时间才给弄好的)
测试 IK分词,可以在solr界面,选择fuser_*,然后选择Analysis,选择FieldType:text_ik, 在Field Value中输入中文,点击按钮 Analyse Values即可看到分词结果了。
在此, 祝每一位不断挑战自己的程序员们都有一个健康的身体和不断向前的决心,未来都能成为自己心中那个想要成为的人,加油!
附件有IK的jar包和相关文件
作为开发人员,在阅读该篇博客之前最好已具备以下基本技能:
了解Linux命令、HBase Shell、Solr schema.xml文件的常用的标签含义、CDH集群基本操作(所需服务安装、卸载、配置)
HBASE
在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)
方案具体实施流程
前提:
CDH5.7.6 Zookeeper集群已搭建
CDH5.7.6 HBase集群已搭建
CDH5.7.6 Solr集群已搭建
CDH5.7.6 Key-Value Store Indexer集群已搭建
推荐clouderamanager(简称CM)来管理集群
接下来,开始我们的方案实施:
第一步:
开启Hbase的复制功能
解释:
通过CM界面修改HBase配置,勾上启用复制、启用编制索引,其余项设置默认值即可
第二步:
通过Linux终端,进入HBase Shell,输入命令,开启HBase表的复制功能
解释:
命令:
引用
create 'table名称',{NAME=>'列簇名', REPLICATION_SCOPE=>1}
# 1 表示开启replicaiton功能,默认为0,不开启
对于已经创建的表可以使用以下命令:
引用
disable 'table名称' #执行
alter 'table名称',{NAME=>'列簇名', REPLICATION_SCOPE=>} #执行
enable 'table名称' #执行
alter 'table名称',{NAME=>'列簇名', REPLICATION_SCOPE=>} #执行
enable 'table名称' #执行
第三步:
生成实体配置文件
解释:
执行命令:
引用
solrctl instancedir --generate /opt/cdhsolr/fuser
# solrctl instancedir --generate 你想要指定的路径
# solrctl --help 可以查看帮助
# solrctl instancedir --generate 你想要指定的路径
# solrctl --help 可以查看帮助
第四步:
编辑生成好的schema.xml文件
解释:
schema.xml文件在上一步指定的路径下的conf文件夹中
当前步,将hbase表中需要索引的列添加到schema.xml中,添加field节点,
注意:field节点的name属性值要与下面定义的Morphline.conf文件中的
outputField属性值对应
例:
引用
<field name="f_name" type="string" indexed="true" stored="false"/>
第五步:
创建collection实例并将实体配置文件上传到zk
解释:
执行命令:
引用
solrctl instancedir --create fuser /opt/cdhsolr/fuser
注意:如果报错,查看具体报错原因,然后百度或者谷歌,有些时候的错误是因为
个人的粗心大意或者集群配置有问题,多多注意,对待技术要严谨
如果修改了/opt/cdhsolr/fuser/conf下的schema.xml文件,需要重新上传加载,执行如下命令:
引用
solrctl instancedir --update fuser /opt/cdhsolr/fuser
solrctl collection --reload fuser
solrctl collection --reload fuser
第六步:
配置文件上传到zk上了,其他节点就可以从zk上下载配置文件。接下来创建solr分片
解释:
执行命令:
引用
solrctl collection --create fuser -s 3 -r 1 -m 4 -c fuser -a
命令解释:
创建solr分片时,要根据实际情况定s(shard)、r(replication),m(maxShardsPerNode),否则报错
其中-s是3个分片(shard),我们的solrclound是3台机器,-r是1个副本(replication),-c是指定zk上solr/configs节点下使用的配置文件名称,-a是允许添加副本(必须写,否则创建不了副本),-m 默认值是1,注意三个数值:numShards、replicationFactor、liveSolrNode,一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件:
numShards*replicationFactor<liveSolrNode*maxShardsPerNode
以上命令可以简化,如下:
引用
solrctl collection --create fuser -s 3 -r 1 -m 4
第七步:
创建Lily HBase Indexer 配置文件 morphline-hbase-mapper.xml
解释:
引用
<?xml version="1.0" encoding="UTF-8"?>
<indexer table="table名称" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">
<param name="morphlineFile" value="绝对路径的morphlines.conf"></param>
<param name="morphlineId" value="fuserMap"></param>
</indexer>
<indexer table="table名称" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">
<param name="morphlineFile" value="绝对路径的morphlines.conf"></param>
<param name="morphlineId" value="fuserMap"></param>
</indexer>
morphlines.conf文件需要在集群每台机器下同一个目录文件下,文件内容如下:
引用
SOLR_LOCATOR : {
# Name of solr collection
collection : collection
# ZooKeeper ensemble
zkHost : "$ZK_HOST"
}
morphlines : [
{
id : fuserMap # 对应 morphline-hbase-mapper.xml文件中的morphlineId值
importCommands : ["org.kitesdk.**", "com.ngdata.**"]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "列簇名:f_name"
outputField : "f_name(schema.xml 中field的name属性值)"
type : string
source : value
}
{
inputColumn : "列簇名:f_type"
outputField : "f_type(schema.xml 中field的name属性值)"
type : string
source : value
}
]
}
}
{ logDebug { format : "output record: {}", args : ["@{}"] } }
]
}
]
# Name of solr collection
collection : collection
# ZooKeeper ensemble
zkHost : "$ZK_HOST"
}
morphlines : [
{
id : fuserMap # 对应 morphline-hbase-mapper.xml文件中的morphlineId值
importCommands : ["org.kitesdk.**", "com.ngdata.**"]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "列簇名:f_name"
outputField : "f_name(schema.xml 中field的name属性值)"
type : string
source : value
}
{
inputColumn : "列簇名:f_type"
outputField : "f_type(schema.xml 中field的name属性值)"
type : string
source : value
}
]
}
}
{ logDebug { format : "output record: {}", args : ["@{}"] } }
]
}
]
本例这两个文件均放在:/opt/cdhsolr 文件夹下,文件名分别为:morphline-hbase-mapper.xml和 morphlines.conf
第九步:
注册Lily HBase Indexer Configuration 和 Lily HBase Indexer service
解释:
执行命令:(具体命令查看帮助 hbase-indexer --help,此命令中的 斜杠 是linux中对过长的命令进行换行的操作)
引用
hbase-indexer add-indexer \
--name fuserIndexer \ # 名称自定义
--indexer-conf /opt/cdhsolr/morphline-hbase-mapper.xml \ # 指定索引映射文件
--connection-param solr.zk=cdh1:2181,cdh2:2181,cdh3:2181/solr \ #指定zk连接参数,注意最后的 /solr 必须加上
--connection-param solr.collection=fuser \ # 先前指定的collection的名称
--zookeeper cdh1:2181,cdh2:2181,cdh3:2181
--name fuserIndexer \ # 名称自定义
--indexer-conf /opt/cdhsolr/morphline-hbase-mapper.xml \ # 指定索引映射文件
--connection-param solr.zk=cdh1:2181,cdh2:2181,cdh3:2181/solr \ #指定zk连接参数,注意最后的 /solr 必须加上
--connection-param solr.collection=fuser \ # 先前指定的collection的名称
--zookeeper cdh1:2181,cdh2:2181,cdh3:2181
命令执行结束后,检验索引器是否创建成功
执行如下命令:
引用
hbase-indexer list-indexers [--zookeeper cdh3:2181] # 中括号中内容可省
执行结果:当看到当前创建的 fuserIndexer 下面显示 +0 failed processes 则代表索引创建并执行成功
如果所引起需要重建,删除使用下列方法,如果删除不了,始终在删除中的死循环中,就需到zk上手动删除节点信息: ls /ngdata/hbaseindexer 下
引用
删出命令: hbase-indexer delete-indexer -n fuserIndexer --zookeeper cdh3:2181
第十步:
测试put数据查看结果
解释:
进入hbase shell,往先前创建的 table 中 put 数据,等几秒,我们就可以在相对的solr中查询到该插入的数据,表明配置成功。
第十一步:
使用IK分词器,应为该集群使用到的solr版本为4.10.3-cdh5.7.5,所以使用的 IK 包为IKAnalyzer2012FF_u1.jar,如果是3x的solr,使用IKAnalyzer2012_u6.jar
具体操作如下:
引用
1.在/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF创建classes目录
2.把IKAnalyzer.cfg.xml 和 stopword.dic添加到classes目录
3.把IKAnalyzer2012FF_u1.jar添加到/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib目录
4.修改 /opt/cdhsolr/fuser/conf/schema.xml文件,在其中添加
<!--配置IK分词器-->
配置好后,执行以下命令:
重启集群的solr服务
2.把IKAnalyzer.cfg.xml 和 stopword.dic添加到classes目录
3.把IKAnalyzer2012FF_u1.jar添加到/opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib目录
4.修改 /opt/cdhsolr/fuser/conf/schema.xml文件,在其中添加
<!--配置IK分词器-->
引用
<fieldType name="text_ik" class="solr.TextField">
<!--索引时候的分词器-->
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<!--查询时候的分词器-->
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<!--索引时候的分词器-->
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<!--查询时候的分词器-->
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
配置好后,执行以下命令:
引用
solrctl instancedir --update fuser /opt/cdhsolr/fuser #执行
solrctl collection --reload fuser #执行
solrctl collection --reload fuser #执行
重启集群的solr服务
到此就结束了,整个方案实施过程中不免会存在各种各样小问题,相信自己,只要多和身边人交流,总能成功的。(PS:小鸟一枚,也是在同事的帮助下,花了近一天的时间才给弄好的)
测试 IK分词,可以在solr界面,选择fuser_*,然后选择Analysis,选择FieldType:text_ik, 在Field Value中输入中文,点击按钮 Analyse Values即可看到分词结果了。
在此, 祝每一位不断挑战自己的程序员们都有一个健康的身体和不断向前的决心,未来都能成为自己心中那个想要成为的人,加油!
引用
附件有IK的jar包和相关文件