概述
億級數據多條件組合查詢——秒級響應解決方案簡述了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
該文件中配置了需要索引的字段名稱、類型以及其它若干屬性。因此在文件中寫入自己所需要索引的字段即可。示例的索引字段爲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。
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進行清空。
注意
- 如果需要徹底刪除某個Collection,需按順序執行以上四條指令,並將~/solr下的配置目錄myConfig進行刪除;
- 可以根據需求對以上指令進行選擇性執行,但執行順序不變。
總結
Solr+Hbase+HbaseIndexer
查詢方案的整體配置流程如上,如需創建多個Collection以及hbase、solr數據同步,對上述步驟重複操作多次即可。若有其它疑問,歡迎交流探討。