使用Lily HBase NRT Indexer為HBase構建二級索引

使用CDH提供的 Cloudera Search創建二級索引:

近實時索引常使用Apache Flume或Apache Kafka來不斷的攝取並索引數據。

Lily HBase NRT Indexer既可以用在近實時索引又可用在批索引。

Lily HBase NRT Indexer服務是靈活的、可擴展的、容錯的、具有事物性、近實時的系統,解決更新HBase數據的時候,同步更新索引數據。可以使用它為HBase構建二級索引。

它使用SolrCloud來索引存儲在HBase中的數據,當HBase執行插入、更新、刪除操作的時候,利用標準HBase複製功能,索引器保證SolrCloud中的索引數據和HBase中的數據一致。

索引器支持自定義,使其可以按照應用相關的規則對存儲在HBase的數據抽取、轉換,並插入Solr中。

儘可能多地在不同的主機上運行Lily HBase NRT Indexer,因為創建索引的任務被共享給所有的索引器,可以通過更多的索引器擴展構建索引的能力,建議一個HBase RegionServer一個Indexer,不過在高可用系統中,最少應該開啟5個Indexer。

1準備工作

開啟集群範圍內的HBase複製功能

Cloudera Manager:

1)依次操作HBase service > Configuration > Category > Backup

2)勾選Enable Replication(啟用複製)

3)設置Replication Source Ratio(複製來源比例)為1

4)設置Replication Batch Size(複製批大小)為1000

5)點擊Save Changes(保存變更)

6)重啟HBase集群

添加Lily HBase NRT Indexer服務

在Cloudera Manager中,Lily HBase NRT Indexer服務被稱為Key-Value Store Indexer,在服務角色類型中被稱為Lily HBase Indexer,如果在部署集群的時候沒有將這個服務加進來,那麼使用Cloudera Manager將其加進來就可以了。

為Lily HBase NRT Indexer配置HBase依賴

在啟動Lily HBase NRT Indexer服務之前,必須使用目標HBase集群使用的ZooKeeper的位置配置各個服務,如果使用Cloudera Manager管理集群,那麼當你設置HBase Service的依賴時這一步會自動完成(Key-Value Store Indexer service > Configuration)

啟動Lily HBase NRT Indexer

如果使用Cloudera Manager管理集群,就可以使用Cloudera Manager啟動服務了,官網文檔也提供了不使用Cloudera Manager的情況下如何啟動服務。

2使用Lily HBase NRT Indexer服務

2.1啟用HBase列族複製功能

對於每一個已存在的表,為表的每個列族設置REPLICATION_SCOPE,如:

hbase shell

hbase shell> disable 'sample_table'

hbase shell> alter 'sample_table', {NAME => 'columnfamily1', REPLICATION_SCOPE => 1}

hbase shell> enable 'sample_table'

對於每一個新表,為表的每個列族設置REPLICATION_SCOPE:

hbase shell

hbase shell> create 'test_table', {NAME => 'testcolumnfamily', REPLICATION_SCOPE => 1}

2.2在Cloudera Search中創建一個聚集

搜索用的聚集必須具有Solr模式,適配被索引的HBase列族和列。我們先看看包括所有HBase列族和列的Solr模式。例如,使用下面的命令創建:

solrctl instancedir --generate $HOME/hbase_collection_config

## Edit $HOME/hbase_collection_config/conf/schema.xml as needed ##

## If you are using Sentry for authorization, copy solrconfig.xml.secure to solrconfig.xml as follows: ##

## cp $HOME/hbase_collection_config/conf/solrconfig.xml.secure $HOME/hbase_collection_config/conf/solrconfig.xml ##

solrctl instancedir --create hbase_collection_config $HOME/hbase_collection_config

solrctl collection --create hbase_collection -s <numshards> -c hbase_collection_config/<numshards>

2.3創建Lily HBase Indexer配置文件

使用hbase-indexer命令行工具創建單獨的Lily HBase Indexer,一般地為每一個HBase表配備一個Lily HBase Indexer配置文件。Lily HBase Indexer配置文件是一個XML文件,例如morphline-hbase-mapper.xml。每個Lily HBase Indexer配置文件都涉及到MorphlineResultToSolrMapper的實現,並指向Morphline配置文件的位置,例如下面的morphline-hbase-mapper.xml。

我們一般使用Cloudera Manager來管理集群,所以設置morphlineFile為morphlines.conf相對路徑。如果不使用Cloudera Manager來管理集群,那麼設置morphlineFile為Lily HBase Indexer主機上的morphlines.conf文件絕對路徑。要確保這個文件可被HBase系統讀取。

使用Lily HBase NRT Indexer為HBase構建二級索引

Lily HBase Indexer配置文件英文說明見:https://github.com/NGDATA/hbase-indexer/wiki/Indexer-configuration#table

最基本的配置文件只需要一個表名和一個字段。

<indexer>

<field>

全局的索引屬性

頂級元素<indexer>的屬性如下:/<indexer>

table

需要索引的HBase表名。

mapping-type

這個屬性可能有兩個值:row, 或column。這個屬性指明是基於行還是列做二級索引。

基於行做索引是將HBase表中的一行作為單個solr文檔的輸入。這種索引方式用於每一行都代表一個獨立實體的情形。這是,默認的mapping-type配置值。

基於列做索引是將HBase表中的每個Cell作為單個solr文檔的輸入。這種索引方式用於,例如,一個用戶的所有信息都存儲在為一行,並且每一個信息存儲在一個Cell中。

read-row

這個屬性有兩個值dynamic(默認的設置),或never。

只有當基於行做索引時,這個屬性才是重要的。它指明索引器是否應該重新讀取HBase數據以便執行索引。

當設置為dynamic時,如果一行的一部分數據被更新了,索引器將從這一行中讀取必要的數據。在dynamic模式下,如果所有待索引數據都包含在行更新中,那麼這行不會被重新讀取。

如果設置為never,永遠都不會重新讀取一行。

mapper

允許用戶使用自定義的mapper類,這個mapper類會根據HBase結果對象創建一個solr文檔。自定義的mapper類必須實現com.ngdata.hbaseindexer.parse.ResultToSolrMapper接口。

默認地使用內建的com.ngdata.hbaseindexer.parse.DefaultResultToSolrMapper

unique-key-formatter

指定Solr中使用的文檔標識符字段的名稱。默認是“id”。

row-field

指定用於存儲HBase行鍵的Solr字段的名稱。這個屬性僅在基於列索引時才起作用。為了使索引器能夠從索引中刪除單行的所有文檔,它需要能夠在Solr中找到該行的所有文檔。在索引器定義中填充此屬性時,它的值將用作Solr中字段的名稱以存儲編碼的行鍵。默認情況下,此屬性為空,表示行鍵未存儲在Solr中。 這樣做的結果是刪除HBase中的完整行或完整列族不會刪除Solr中的索引文檔。

column-family-field

用於存儲HBase列族名稱的Solr字段名稱。詳見row-field屬性。默認為空。

table-name-field

指定Solr字段的名稱,該字段用於存儲HBase表名,默認為空,因此除非在索引器配置中顯式設置此屬性,否則不會存儲HBase表名。

用於索引器定義的元素

<field>

field元素定義要在Solr中索引的單個字段,以及從HBase獲取和解釋其內容的位置。 索引器配置中通常會列出一個或多個字段 - 每個字段用於存儲每個Solr字段。

field元素有四個屬性:name、value、source、type。

name

name屬性指定用於存儲數據的Solr字段的名稱。應在Solr模式中定義具有匹配名稱的字段。name屬性是必需的。

value

value屬性指定用來填充Solr字段的來自HBase中數據,它採用列族名稱(column family )和限定符(qualifier)的形式,用冒號分隔。

限定符部分可以以星號結尾,星號被解釋為通配符。 在這種情況下,將使用所有匹配的列族和限定符表達式。

下面是幾個例子:

mycolumnfamily:myqualifier

mycolumnfamily:my*

mycolumnfamily:*

source

source屬性確定HBase KeyValue的哪個部分將用作索引內容。

這個屬性可能值為:value、qualifier。

如果指定為value,那麼Cell的值將被索引。

如果指定位qualifier,column qualifier將被索引。

type

定義HBase中內容的數據類型。

因為所有數據都作為字節數組存儲在HBase中,但Solr中的所有內容都被索引為文本,因此需要一種從字節數組轉換為實際數據類型的方法。

此字段的值可以是HBase Bytes類支持的任何數據類型之一:int,long,string,boolean,float,double,short或bigdecimal。

如果基於字節的表示尚未用於HBase中存儲數據,可為這個屬性指定自定義名稱。自定義類必須實現com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口。

<param>元素

<param>元素定義了一個鍵值對,它將提供給實現com.ngdata.hbaseindexer.Configurable接口的自定義類。

<param>元素也可以嵌套在<field>元素中。/<field>

該元素有兩個屬性:name和value。 兩者都是強制性的

看看給出的例子:

使用Lily HBase NRT Indexer為HBase構建二級索引

2.4創建Morphline配置文件

創建完索引器配置文件後,可以在morphlines.conf配置文件中配置morphline ETL轉換命令,morphlines.conf配置文件可以包含任何數量的morphline ETL轉換命令。一般地,extractHBaseCells是第一個命令,readAvroContainer或 readAvro這兩個morphline命令被用與從HBase字節數組中提取Avro數據。此配置文件可以在使用morphlines的不同應用程序之間共享。

如果使用Cloudera Manager,依次點擊Key-Value Store Indexer service > Configuration > Category > Morphlines > Morphlines File,就可以編輯morphlines.conf了。

2.5理解Morphline 命令extractHBaseCells

extractHBaseCells抽取HBase數據,並將其轉換為SolrInputDocument。這個命令有0個或多個命令規範組成。

對於每個映射都有:

1)inputColumn參數

指定要填充到Solr字段的HBase數據。它具有列族名稱和限定符的形式,以冒號分隔列族名稱和限定符。限定符部分可以以星號結尾,星號被解釋為通配符。在這種情況下,將使用所有匹配的列族和限定符表達式。下例為有效inputColumn值:

mycolumnfamily:myqualifier

mycolumnfamily:my*

mycolumnfamily:*

2)outputField參數

指定morphline記錄字段,這些記錄要被添加到輸出值中。morphline記錄字段也被稱為Solr文檔字段。

以*結尾的outputField參數可以開啟動態輸出字段。例如:

inputColumn : "mycolumnfamily:*"

outputField : "belongs_to_*"

這樣如果在HBase中執行Put操作:

put 'table_name' , 'row1' , 'mycolumnfamily:1' , 'foo'

put 'table_name' , 'row1' , 'mycolumnfamily:9' , 'bar'

那麼solr文檔字段為:

belongs_to_1 : foo

belongs_to_9 : bar

3)type參數

定義了存儲在HBase中的內容的類型。HBase中的數據都是字節數組,而Solr中的索引文件是文本文檔。所以需要一個方法將字節數組轉換為實際類型。type參數可以是類型名稱,org.apache.hadoop.hbase.util.Bytes.to*要支持這種類型(目前包括byte[], int, long, string, boolean, float, double, short, 和bigdecimal)。使用類型byte[]傳遞字節數組給morphline而不用轉換。

type:byte[],將字節數組不加修改地拷貝到記錄的輸出字段。其他是調用相應的方法進行轉換。例如使用org.apache.hadoop.hbase.util.Bytes.toInt轉換int。或者type是實現了com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口的Java類的名稱。HBase數據格式化並不總是與org.apache.hadoop.hbase.util.Bytes指定的格式相匹配。可以通過轉換數據來索引這個HBase數據。可以使用下面的方式:

  • 使用Java morphline命令來解析輸入數據

{

imports : "import java.util.*;" code: """ // manipulate the contents of a record field

String stringAmount = (String) record.getFirstValue("amount");

Double dbl = Double.parseDouble(stringAmount); record.replaceValues("amount",dbl);

return child.process(record); // pass record to next command in chain """

}

  • 使用二進制格式創建表字段,然後在morphline.conf中使用double或float等類型。你可以在HBase中創建一個表,使用類似於以下命令將雙精度數存儲在這個表中:

CREATE TABLE sample_lily_hbase ( id string, amount double, ts timestamp )

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ('hbase.columns.mapping' = ':key,ti:amount#b,ti:ts,')

TBLPROPERTIES ('hbase.table.name' = 'sample_lily');

4)source參數確定HBase KeyValue的哪個部分用作索引輸入。有效選擇是value 或qualifier。指定為value 時,HBase Cell值將用作索引的輸入。指定為qualifier時,HBase列限定符將用作索引的輸入。默認值是value。

2.6使用Lily HBase Indexer Service註冊Lily HBase Indexer配置

配置完Lily HBase Indexer的配置文件後,可以使用Lily HBase Indexer Service.註冊它。註冊其實就是上傳配置文件到zookeeper。

1)如果集群開啟了安全策略,創建Java認證和授權服務(JAAS),JAAS配置文件名稱為jaas.conf,其在home目錄中,內容如下。

Client {

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=false

useTicketCache=true

principal="[email protected]";

};

替換[email protected]為你的用戶主體。你的用戶賬號一定有寫權限,以便可以創建索引。

使用命令授權:kinit [email protected]

2)運行下面的命令註冊索引器配置文件,如果開啟了哨兵認證,添加--http http://lily01.example.com:11060/indexer/,使用你的Lily HBase Indexer主機名替換lily01.example.com。

hbase-indexer add-indexer \\

--name myIndexer \\

--indexer-conf $HOME/morphline-hbase-mapper.xml \\

--connection-param solr.zk=zk01.example.com,zk02.example.com,zk03.example.com/solr \\

--connection-param solr.collection=hbase_collection \\

--zookeeper zk01.example.com:2181,zk02.example.com:2181,zk03.example.com:2181

3)像下面這樣驗證索引器是否創建成功。如果開啟了哨兵認證,添加--http http://lily01.example.com:11060/indexer/,使用你的Lily HBase Indexer主機名替換lily01.example.com。

hbase-indexer list-indexers -zookeeper zk01.example.com:2181,zk02.example.com:2181,zk03.example.com:2181
Number of indexes: 1

myIndexer
+ Lifecycle state: ACTIVE
+ Incremental indexing state: SUBSCRIBE_AND_CONSUME
+ Batch indexing state: INACTIVE
+ SEP subscription ID: Indexer_myIndexer
+ SEP subscription timestamp: 2013-06-12T11:23:35.635-07:00
+ Connection type: solr
+ Connection params:
+ solr.collection = hbase-collection1
+ solr.zk = localhost/solr
+ Indexer config:
110 bytes, use -dump to see content
+ Batch index config:
(none)
+ Default batch index config:
(none)
+ Processes
+ 1 running processes
+ 0 failed processes

4)使用hbase-indexer的update-indexer和delete-indexer選項操作已經存在的Lily HBase Indexers,如果開啟了哨兵認證,添加--http http://lily01.example.com:11060/indexer/,使用你的Lily HBase Indexer主機名替換lily01.example.com。

我們可以使用下面的命令查看命令幫助文檔:

hbase-indexer add-indexer --help

hbase-indexer list-indexers --help

hbase-indexer update-indexer --help

hbase-indexer delete-indexer --help

每一個運行索引器的主機都必須有一個morphlines.conf,如果使用Cloudera Manager,那麼這個是自動完成的。

可以在不重新創建索引器的情況下更改Morphline配置文件,但必須重啟Lily HBase Indexer服務,這樣才會生效。

2.7驗證索引是否生效

向待索引表中加入數據

hbase shell

hbase(main):001:0> put 'sample_table', 'row1', 'data', 'value'

hbase(main):002:0> put 'sample_table', 'row2', 'data', 'value2'

執行成功後到SolrCloud UI查詢試試。

要打印診斷信息,例如通過morphline命令傳遞的記錄內容,通過將以下內容添加到log4j.properties文件來啟用TRACE日誌級別:loudera CDH的

log4j.logger.org.kitesdk.morphline=TRACE

log4j.logger.com.ngdata=TRACE

對於Cloudera Manager,日誌配置如下修改:

1)Key-Value Store Indexer service > Configuration > Category > Advanced.

2)找到Lily HBase Indexer Logging Advanced Configuration Snippet (Safety Valve)(Lily HBase Indexer日誌記錄高級配置代碼段(安全閥))屬性,或通過在“搜索”框中鍵入其名稱來搜索它。

3)點擊保存修改

4)重啟服務Key-Value Store Indexer service > Actions > Restart,查看日誌文件/var/log/hbase-solr/lily-hbase-indexer-*可得詳細信息


分享到:


相關文章: