Solr+Hbase+Hbase Indexer查询方案流程整合

概述

亿级数据多条件组合查询——秒级响应解决方案简述了Hbase+Solr的亿级数据多条件组合查询的解决方案,但是当时并未将HBaseIndexer这一组件加入进来,而是暂时采用手工的形式对Hbase和Solr的数据进行同步。本文基于该解决方案,使用HbaseIndexer的原生组件对Hbase和Solr中的数据进行增删改查的同步,简述整个Solr+Hbase+HbaseIndexer解决方案的配置过程。

注意:为避免歧义,本文使用的所有配置文件的路径均为~/solr

Hbase部分

1. Hbase建表

首先需要对Hbase启用复制功能,修改hbase.replication参数。然后按照正常流程创建Hbase表,需要添加一条额外属性,开始Hbase的复制(REPLICATION)功能(1表示开启replication功能,0表示不开启,默认为0 )。

表不存在:

create ‘表名’, {NAME => ‘列族名’, REPLICATION_SCOPE => 1}

表已存在:

disable ‘表名’
alter ‘表名’,{NAME => ‘列族名’, REPLICATION_SCOPE => 1}
enable ‘表名’

Solr部分

1. 创建SolrCloud

使用如下指令创建SolrCloud,生成配置文件:

solrctl --zk master:2181,slave1:2181,slave2:2181/solr instancedir \
--generate ~/solr/myConfig

其中–zk参数为zookeeper集群的结点:端口号,以逗号分隔。该指令会在~/solr/myConfig目录下生成conf文件夹,其中包含schema.xml配置文件。

2. 修改schema.xml

该文件中配置了需要索引的字段名称、类型以及其它若干属性。因此在文件中写入自己所需要索引的字段即可。示例的索引字段为objTypeobjIdiduniqueKey是该配置文件原有的默认字段,对应着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。

3. 初始化Collection

使用以下指令初始化Collection,该Collection名为testCollection,并将以上修改的配置文件所在的文件夹上传至zookeeper集群进行管理。

solrctl --zk master:2181,slave1:2181,slave2:2181/solr instancedir \
--create testCollection ~/solr/myConfig
4. 创建Collection

创建上述步骤初始化的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

HbaseIndexer部分

1.创建Morphline配置文件

首先需要在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目录下(可更换为其它目录,后续指令的目录路径参数需要更改)。

2.创建Lily HBase Indexer配置

创建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字段对应。

3.创建Lily HBase Indexer

使用以下指令添加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
4.同步数据

如果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

附录指令

1.删除Hbase Indexer实例
hbase-indexer delete-indexer --name testIndexer \
--zookeeper master:2181,slave1:2181,slave2:2181

上述指令会将Hbase Indexer中的indexer实例进行删除,删除后对Indexers进行list将查询不到。

2.删除collection所有doc
solrctl collection --deletedocs testCollection

上述指令会将Solr中该Collection中的数据进行清空。

3.删除collection
solrctl collection --delete testCollection

上述指令会将SolrCloud中的Collection进行删除,在Solr的可视化界面将无法看到该Collection的分片数据。

4.删除instancedir
solrctl instancedir --delete testCollection

上述指令会将Collection进行删除,并将zookeeper中包含该Collection信息的collection和config进行清空。

注意
  1. 如果需要彻底删除某个Collection,需按顺序执行以上四条指令,并将~/solr下的配置目录myConfig进行删除;
  2. 可以根据需求对以上指令进行选择性执行,但执行顺序不变。

总结

Solr+Hbase+HbaseIndexer查询方案的整体配置流程如上,如需创建多个Collection以及hbase、solr数据同步,对上述步骤重复操作多次即可。若有其它疑问,欢迎交流探讨。

你可能感兴趣的:(架构,Solr,Hbase,Hbase,Indexer,Indexer,方案)