1. 程式人生 > >使用HBase Indexer建立二級索引(整合最新版本的HBase1.2.6及Solr 7.2.1)

使用HBase Indexer建立二級索引(整合最新版本的HBase1.2.6及Solr 7.2.1)

這段時間整合HBase,需要為HBase建立二級索引,方便資料的查詢使用,Solr權威指南上面有Hbase與Solr的整合章節,照著書上以及網上的說明折騰了很近才配置成功,HBase Indexer已經有1年多沒有更新了,整合最新的HBase1.2.6,solr7.2.1有很多相關的介面都發送了變化

1.下載HBaseIndexer 專案:

官網:http://ngdata.github.io/hbase-indexer/

github:https://github.com/NGDATA/hbase-indexer

wiki(配置說明):https://github.com/NGDATA/hbase-indexer/wiki

sep tools cli說明(狀態監控):https://github.com/NGDATA/hbase-indexer/tree/master/hbase-sep/hbase-sep-tools

2.下載完成後修改根目錄的pom.xml

配置版本調整到我們需要的hbase及solr版本,version.solr.mapreduce及httpclient.core 是自己新增的版本號,需要修改pom內相應的位置,因為這兩個包跟主jar的版本不同步:

  <properties>
    <version.solr>7.2.1</version.solr>
    <version.solr.mapreduce>6.5.1</version.solr.mapreduce>
    <version.guava>12.0.1</version.guava>
    <version.joda-time>1.6</version.joda-time>
    <version.slf4j>1.7.7</version.slf4j>
    <version.hbase>1.2.6</version.hbase>
    <version.hadoop>2.7.4</version.hadoop>
    <version.zookeeper>3.4.6</version.zookeeper>
    <version.jackson>1.9.13</version.jackson>
    <!-- version.httpclient>4.3</version.httpclient -->
	<version.httpclient>4.5.3</version.httpclient>
	<version.httpclient.core>4.4.6</version.httpclient.core>
	<!--     <version.kite>0.13.0</version.kite> -->
    <version.kite>0.15.0</version.kite>
    <version.jersey>1.17</version.jersey>
    
    <version.surefire.plugin>2.19.1</version.surefire.plugin>
    <version.failsafe.plugin>${version.surefire.plugin}</version.failsafe.plugin>

    <!-- Tells maven plugins what file encoding to use -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
新增plugins方便提取jar:
	  <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-dependency-plugin</artifactId>  
			<configuration>
				<outputDirectory>${project.build.directory}</outputDirectory>
				<excludeTransitive>false</excludeTransitive>
			</configuration>
        </plugin>  

3.將專案匯入到eclipse(處理版本升級後帶來的編譯問題)
需要注意的是:pom.xml內有幾個外掛eclipse的m2eclipse外掛不相容,需要ctrl+i ignore掉:否則會提示Lifecycle問題
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <versionRange>1.6</versionRange>

<groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <versionRange>2.8</versionRange>
如果在eclipse下面要執行專案的話,需要自己把這幾個外掛做的邏輯手動做一下:

(1).替換hbase-indexer-default.xml內的版本號

(2).生成hbase-indexer-common\src\main\java\com\ngdata\hbaseindexer\package-info.java 檔案:

@VersionAnnotation(version="1.6-SNAPSHOT", revision="Unknown",
                         user="root", date="Thu Feb  1 21:15:10 CST 2018", url="file:///E:/work/windtrend/hbase-indexer/hbase-indexer-common")
package com.ngdata.hbaseindexer;
server啟動的時候會檢測 @VersionAnnotation內的版本 (3).修改相應的編譯問題 4.修改完成後將整個目錄上傳到 linux,執行mvn進行編譯,(maven編譯的時候需要執行shell指令碼,windows下要編譯需要改pom.xml檔案) (1).mvn clean install -e -DskipTests           (2).mvn dependency:copy-dependencies  #抽取jar包 (3).mkdir lib (4).find ./ -type f -iname "*.jar" -exec cp {} lib/ \; #抽取jar包 (5).rm -rf lib/*-sources.jar (6).將目錄內的bin,conf,lib複製到到一個新資料夾如:hbase-indexer-1.6 (7).將hbase-indexer-1.6複製到部署環境即可 5.配置hbase-indexer (1).配置環境變數:(/etc/profile) export HBASE_INDEXER_HOME=XXX/hbase-indexer-1.6 (2).vi conf/hbase-indexer-env.sh 
export HBASE_INDEXER_HEAPSIZE=1024
export HBASE_INDEXER_LOG_DIR=$HBASE_INDEXER_HOME/logs
export HBASE_INDEXER_PID_DIR=$HBASE_INDEXER_HOME/pid
export HBASE_INDEXER_CLI_ZK=master,slave1,slave2,slave3
其它配置可根據情況進行修改,如遠端除錯:
export HBASE_INDEXER_OPTS="$HBASE_INDEXER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8075"

(3).配置log4j.xml,專案內的log4j.properties有問題無法載入 (4).新建 order-indexer.xml
<?xml version="1.0"?>
<indexer table="t_order" unique-key-field="id">
  <field name="number" value="f:number" type="string"/>
  <field name="source" value="f:source" type="int"/>
  <field name="tenantId" value="f:tenantId" type="int"/>
  <field name="userId" value="f:userId" type="int"/>
  <field name="storeId" value="f:storeId" type="int"/>
  <field name="storeName" value="f:storeName" type="string"/>
  <field name="storeNumber" value="f:storeNumber" type="string"/>
  <field name="userName" value="f:userName" type="string"/>
</indexer>
(5).新建order-schema.xml (找一個solr內的預設 schema修改即可)
  <field name="number" type="string" indexed="true" stored="true"/>
  <field name="source" type="int"  indexed="true" stored="true"/>
  <field name="tenantId" type="int"  indexed="true" stored="true"/>
  <field name="userId" type="int"  indexed="true" stored="true"/>
  <field name="storeId" type="int"  indexed="true" stored="true"/>
  <field name="storeName" type="string"  indexed="true" stored="true"/>
  <field name="storeNumber" type="string"  indexed="true" stored="true"/>
  <field name="userName" type="string"  indexed="true" stored="true"/>

6.配置solr(solr必須是cloud模式,看了程式碼也可以是classic模式,但是classic模式內配置的引數全是solr.shard.xxx)

(1).配置solr cloud

(2).建立collection order

bin/solr create -c order
(3).上傳schema:
./solr-7.2.1/server/scripts/cloud-scripts/zkcli.sh -z localhost:9983 -cmd putfile /configs/order/managed-schema $HBASE_INDEXER_HOME/index/order-schema.xml
注:zkcli是solr提供的指令碼


(4)配置solrconfig 軟提交:

./solr-7.2.1/server/scripts/cloud-scripts/zkcli.sh -z localhost:9983 -cmd  getfile /configs/order/solrconfig.xml $HBASE_INDEXER_HOME/index/solrconfig.xml
修改配置並上傳:
    <autoSoftCommit>
      <maxTime>5000</maxTime>
      <maxDocs>100</maxDocs>  
    </autoSoftCommit>
(5) reload collection

7.配置hbase:

(1).拷貝jar包到hbase lib目錄

cp ./lib/hbase-sep* $HBASE_HOME/lib/
(2).開啟 replication,hbase-site.xml新增如下配置:
	<property>
		<name>hbase.replication</name>
		<value>true</value>
	</property>
	<property>
		<name>replication.source.ratio</name>
		<value>1.0</value>
	</property>
	<property>
		<name>replication.source.nb.capacity</name>
		<value>1000</value>
	</property>
	<property>
		<name>replication.replicationsource.implementation</name>
		<value>com.ngdata.sep.impl.SepReplicationSource</value>
	</property>
(3).複製到各節點,並重啟hbase

8.執行: (1).執行hbase-indexer ./bin/hbase-indexer server (2).新增indexer
./bin/hbase-indexer add-indexer \
                      --name orderindexer \
                      --indexer-conf index/order-indexer.xml \
                      --cp solr.zk=master:9983 \
                      --cp solr.collection=order

(3) 在hbase 內建立表

$ hbase shell
hbase> create 't_order', { NAME => 'f', REPLICATION_SCOPE => '1' }
hbase> put 't_order', 'row1', 'f:userId', 10000
hbase> put 't_order', 'row2', 'f:userId', 10000
(4),進入solr查詢就能看到結果

備註:

目前還沒辦法在windows環境下使用server,windows下面沒有辦法接受到SepEvent,除錯的話需要在linux下面或者開啟遠端debug,hbase-indexer-evn.sh 內有引數可以開啟;


幾個核心處理類:

事件入口:

com.ngdata.sep.impl.SepEventExecutor.scheduleEventBatch(int partition, List<SepEvent> events)

資料處理入口:

com.ngdata.hbaseindexer.indexer.Indexer$RowBasedIndexer

Indexer com.ngdata.hbaseindexer.mr.HBaseIndexerMapper.createIndexer(String indexName, Context context, IndexerConf indexerConf, String tableName, ResultToSolrMapper mapper, Map<String, String> indexConnectionParams) throws IOException, SharderException




參考:

官網:http://ngdata.github.io/hbase-indexer/

github:https://github.com/NGDATA/hbase-indexer

wiki(配置說明):https://github.com/NGDATA/hbase-indexer/wiki

sep tools cli說明(狀態監控):https://github.com/NGDATA/hbase-indexer/tree/master/hbase-sep/hbase-sep-tools


http://www.niuchaoqun.com/14543825447680.html
http://blog.csdn.net/d6619309/article/details/51500368