使用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 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。 兩者都是強制性的
看看給出的例子:
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-*可得詳細信息
閱讀更多 甜橙很酸 的文章