亿级数据多条件组合查询——秒级响应解决方案简述了Hbase+Solr的亿级数据多条件组合查询的解决方案,但是当时并未将HBaseIndexer这一组件加入进来,而是暂时采用手工的形式对Hbase和Solr的数据进行同步。本文基于该解决方案,使用HbaseIndexer的原生组件对Hbase和Solr中的数据进行增删改查的同步,简述整个Solr+Hbase+HbaseIndexer
解决方案的配置过程。
注意:为避免歧义,本文使用的所有配置文件的路径均为~/solr
。
首先需要对Hbase启用复制功能,修改hbase.replication参数。然后按照正常流程创建Hbase表,需要添加一条额外属性,开始Hbase的复制(REPLICATION)功能(1表示开启replication功能,0表示不开启,默认为0 )。
表不存在:
create ‘表名’, {NAME => ‘列族名’, REPLICATION_SCOPE => 1}
表已存在:
disable ‘表名’
alter ‘表名’,{NAME => ‘列族名’, REPLICATION_SCOPE => 1}
enable ‘表名’
使用如下指令创建SolrCloud,生成配置文件:
solrctl --zk master:2181,slave1:2181,slave2:2181/solr instancedir \
--generate ~/solr/myConfig
其中–zk参数为zookeeper集群的结点:端口号,以逗号分隔。该指令会在~/solr/myConfig
目录下生成conf
文件夹,其中包含schema.xml
配置文件。
该文件中配置了需要索引的字段名称、类型以及其它若干属性。因此在文件中写入自己所需要索引的字段即可。示例的索引字段为objType
和objId
,id
和uniqueKey
是该配置文件原有的默认字段,对应着hbase中的rowKey,可不做修改,示例如下:
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="objType" type="string" indexed="true" stored="false" required="flase" multiValued="false" />
<field name="objId" type="string" indexed="true" stored="false" required="flase" multiValued="false" />
</fields>
<uniqueKey>id</uniqueKey>
name:属性的名称,这里有个特殊的属性“version”是必须添加的。
type:字段的数据结构类型,所用到的类型需要在fieldType中设置。
indexed:是否创建索引。
stored:是否存储原始数据。如果不需要返回该字段而只需要通过该字段索引,则可设置为false。
required:添加文档时,该字段必须存在,类似mysql的not null。
使用以下指令初始化Collection,该Collection名为testCollection,并将以上修改的配置文件所在的文件夹上传至zookeeper集群进行管理。
solrctl --zk master:2181,slave1:2181,slave2:2181/solr instancedir \
--create testCollection ~/solr/myConfig
创建上述步骤初始化的Collection,对Collection的属性进行配置。
solrctl --zk master:2181,slave1:2181,slave2:2181/solr collection \
--create testCollection -s 4 -r 2 -m 10
-s表示设置分片Shard数为4,建议设置为SolrCloud集群的机器数
-r表示设置的Replica数为1,创建的副本数为1,建议设置为2及其以上
-m默认值是1,表示最大shards数目,应大于Shard*Replica
-c是指定zk上solr/configs节点下使用的配置文件名称
-a是允许添加副本(必须写,否则创建不了副本)
注:使用如下指令查看是否创建Collection成功。
solrctl --zk master:2181,slave1:2181,slave2:2181/solr collection --list
首先需要在CDH中的Hbase Indexer中搜索并修改Morphline文件,修改内容如下:
SOLR_LOCATOR : {
zkHost : "$ZK_HOST"
}
morphlines : [
{
id : morphlineOfTest
importCommands : ["org.kitesdk.morphline.**", "com.ngdata.**"]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "familyName:objType"
outputField : "objType"
type : string
source : value
}
{
inputColumn : "familyName:objId"
outputField : "objId"
type : string
source : value
}
]
}
}
{
logDebug {
format : "output record: {}", args : ["@{}"] } }
]
}
]
其中id
为该Indexer的名字,mapping
中的内容为需要触发索引的字段,inputColumn
为待索引字段在hbase中相对应的列族名:列名,outputField
为待索引字段在Solr中的schema.xml中配置的相对应的field名。若需要针对多个列族创建索引,则可以增加morphlines
,每个morphlines
之间以逗号进行分隔。
注:在CDH中修改内容后,还需将该文件拷贝一份并命名为morphlines.conf,放至~/solr/myConfig目录下(可更换为其它目录,后续指令的目录路径参数需要更改)。
创建morphline-hbase-mapper-testCollection.xml
文件,在该配置文件中加入以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<indexer table="tableName" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper" mapping-type="row">
<param name="morphlineFile" value="morphlines.conf"/>
<param name="morphlineId" value="morphlineOfTest"/>
其中table
为hbase中需要进行映射的表名,morphlineId
与morphline.xml中的morphlineId
字段对应。
使用以下指令添加Hbase Indexer:
hbase-indexer add-indexer \
--name testIndexer \
--indexer-conf ~/solr/myConfig/morphline-hbase-mapper-testCollection.xml \
--connection-param solr.zk=master:2181,slave1:2181,slave2:2181/solr \
--connection-param solr.collection=testCollection \
--zookeeper master:2181,slave1:2181,slave2:2181
可使用以下指令查看是否添加成功:
hbase-indexer list-indexers \
--zookeeper master:2181,slave1:2181,slave2:2181
如果Hbase中已经存在数据,可使用以下hadoop程序将Hbase中现有的数据批量同步到Solr:
hadoop --config /etc/hadoop/conf.cloudera.yarn \
jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-*-job.jar \
-D 'mapred.child.java.opts=-Xmx1024m' \
--libjars /home/hadoop/package/lucene-analyzers-smartcn-4.10.3-cdh5.15.0.jar \
--conf /etc/hbase/conf/hbase-site.xml \
--log4j /opt/cloudera/parcels/CDH/share/doc/search*/examples/solr-nrt/log4j.properties \
--hbase-indexer-file ~/solr/myConfig/morphline-hbase-mapper-testCollection.xml \
--morphline-file ~/solr/myConfig/morphlines.conf \
--verbose \
--go-live \
--zk-host master:2181,slave1:2181,slave2:2181/solr \
--collection testCollection
hbase-indexer delete-indexer --name testIndexer \
--zookeeper master:2181,slave1:2181,slave2:2181
上述指令会将Hbase Indexer中的indexer实例进行删除,删除后对Indexers进行list将查询不到。
solrctl collection --deletedocs testCollection
上述指令会将Solr中该Collection中的数据进行清空。
solrctl collection --delete testCollection
上述指令会将SolrCloud中的Collection进行删除,在Solr的可视化界面将无法看到该Collection的分片数据。
solrctl instancedir --delete testCollection
上述指令会将Collection进行删除,并将zookeeper中包含该Collection信息的collection和config进行清空。
Solr+Hbase+HbaseIndexer
查询方案的整体配置流程如上,如需创建多个Collection以及hbase、solr数据同步,对上述步骤重复操作多次即可。若有其它疑问,欢迎交流探讨。