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數據同步,對上述步驟重複操作多次即可。若有其它疑問,歡迎交流探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章