為什么HBase要建立二級索引
在HBase中檢索資料通常有以下三種方式:
- 通過get, 指定RowKey獲取唯一一條記錄
- 通過scan, 設定start和stop進行范圍匹配
- 全表掃描
所以我們發現, 想要精確且快速的定位在HBase表中某一條記錄, 唯一的辦法也就是通過RowKey進行查詢, 然而在多數情況, 需要從多個條件查詢資料, 再依靠單一的Rowkey查詢已經不滿足需求,
方案
Hbase —–> Key Value Store —> Solr ——-> Web前端實時查詢展示
Solr是一個高性能,采用Java5開發,基于Lucene的全文搜索服務器,同時對其進行了擴展,提供了比Lucene更為豐富的查詢語言,同時實作了可配置、可擴展并對查詢性能進行了優化,并且提供了一個完善的功能管理界面,是一款非常優秀的全文搜索引擎,
Key-Value Store Indexer是Hbase到Solr生成索引的中間工具,在CDH5中的Key-Value Store Indexer使用的是Lily HBase NRT Indexer服務
Lily HBase Indexer是一款靈活的、可擴展的、高容錯的、事務性的,并且近實時的處理HBase列索引資料的分布式服務軟體,它是NGDATA公司開發的Lily系統的一部分,已開放源代碼,Lily HBase Indexer使用SolrCloud來存盤HBase的索引資料,當HBase執行寫入、更新或洗掉操作時,Indexer通過HBase的replication功能來把這些操作抽象成一系列的Event事件,并用來保證寫入Solr中的HBase索引資料的一致性,并且Indexer支持用戶自定義的抽取,轉換規則來索引HBase列資料,Solr搜索結果會包含用戶自定義的columnfamily:qualifier欄位結果,這樣應用程式就可以直接訪問HBase的列資料,而且Indexer索引和搜索不會影響HBase運行的穩定性和HBase資料寫入的吞吐量,因為索引和搜索程序是完全分開并且異步的,Lily HBase Indexer在CDH5中運行必須依賴HBase、SolrCloud和Zookeeper服務,
部署流程
首先創建測驗表, 開啟REPLICATION復制功能實作集群間的相互復制
create 'table',{NAME => 'test', REPLICATION_SCOPE => 1}
# 1表示開啟replication, 默認為0
對于已經存在的表
disable 'table'
alter 'table',{NAME => 'test', REPLICATION_SCOPE => 1}
enable 'table'
接下來在安裝有Solr的主機上生成物體組態檔, 使用CDH自帶的solrctl命令
solrctl instancedir --generate /opt/testindex/test
# 路徑可以自定義
在生成的目錄 /opt/testindex/test/ 中, 修改conf/solrconfig.xml, 這個是硬提交 會稍微影響性能
< autoCommit>
< maxTime>${solr.autoCommit.maxTime:60000}< /maxTime>
< openSearcher>true</ openSearcher>
</ autoCommit>
在conf/managed-schema檔案中添加field
*注: 此步也可以省略, 推薦collection創建后在web管理頁面中添加, 否則需要solr重啟或field丟失
< field name=“testId” type=“string” indexed=“true” stored=“true” />
# name是自定義的索引名 后面要魚Morphline.conf中的outputField屬性對應
# type是欄位型別
上傳組態檔到zookeeper
solrctl instancedir --create test /opt/testindex/test
# --create后面跟自定義的名字
# 路徑是剛剛定義的配置路徑 instancedir
創建collection
solrctl collection --create test
# --create后面的名字必須和上一步的名字一致
collection創建后可以在8983/solr web管理面板上看到, 這時可以進入schema創建field
創建Lily HBase Indexer配置
在 之前定義的instancedir路徑下 /opt/testindex/test 創建 morphline-hbase-mapper.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!--table屬性指定hbase要建立索引的表-->
<indexer table="table" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">
<!--value用來指定morphlines.conf檔案的路徑,絕對或者相對路徑用來指定本地路徑,如果是使用Cloudera Manager來管理morphlines.conf就直接寫入值morphlines.conf"-->
<param name="morphlineFile" value="morphlines.conf"></param>
<!--這里value是自定義, 不過稍后需要在Key-Value Store Indexer配置Morphline中用到-->
<param name="morphlineId" value="test"></param>
</indexer>
進入CM管理界面中的Key-Value Store Indexer, 修改Morphline檔案

注:
id: 一定要與剛剛morphline-hbase-mapper.xml中morphlineId的value一致
inputColumn: 需要寫入到solr中的HBase列欄位,值包含列族和列限定符, 并用’ : '分開,其中列限定符也可以使用通配符*來表示, 譬如可以使用c1:表示讀取只要列族為data的所有hbase列資料
outputField: 用來表示morphline讀取的記錄需要輸出的資料欄位名稱, 該名稱必須和solr中的managed-schema檔案的field節點自定義的name名稱或者是在collection中設定的field保持一致,否則寫入不正確
type: 用來定義讀取HBase資料的資料型別HBase中的資料都是以byte[]的形式保存,但是所有的內容在Solr中索引為text形式,所以需要一個方法來把byte[]型別轉換為實際的資料型別,type引數的值就是用來做這件事情的,現在支持的資料型別有:byte,int,long,string,boolean,float,double,short和bigdecimal,當然你也可以指定自定的資料型別,只需要實作com.ngdata.hbaseindexer.parse.ByteArrayValueMapper介面即可
SOLR_LOCATOR : {
# Name of solr collection
collection : hbaseindexer
# ZooKeeper ensemble
zkHost : "$ZK_HOST"
}
morphlines : [
{
id : test
importCommands : ["org.kitesdk.**", "com.ngdata.**"]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "test:test_id"
outputField : "testId"
type : string
source : value
}
]
}
}
{ logDebug { format : "output record: {}", args : ["@{}"] } }
]
}
]
保存后重啟 Key-Value Store Indexer 服務
最后, 注冊 Lily HBase Indexer Configuration 和 Lily HBase Indexer Service
hbase-indexer add-indexer \
--name indexer \
--indexer-conf /opt/testindex/test/morphline-hbase-mapper.xml \
--connection-param solr.zk=node-01:2181,node-03:2181,node-05:2181/solr \
--connection-param solr.collection=cdc \
--zookeeper node-01:2181,node-03:2181,node-05:2181
注:
這里的 --name是指定indexer的name 可以自定義
–indexer-conf 是剛剛我們創建并且編輯好的morphline-hbase-mapper.xml的路徑
solr.zk 哪個節點有solr就寫哪個
solr.collection 指定創建好的collection
–zookeeper zookeeper節點
到這里部署就已經完成了, 這時向我們的表中put幾條資料后再等個幾秒鐘就可以在solr上查詢到對應的資料了.
命令匯總
# 列出所有indexer
hbase-indexer list-indexers
# 洗掉指定indexer
hbase-indexer delete-indexer --name XXX
# 列出所有collection
solrctl collection --list
# 洗掉collection
solrctl collection --delete XXX
# 列出所有instancedir
solrctl instancedir --list
# 洗掉instancedir
solrctl instancedir --delete XXX
寫在最后
發現上面步驟中的test用的有點多, 大家還是根據自己的命名規則去用哈
如果上面寫到的任何地方有問題請隨時指出
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/264534.html
標籤:其他
上一篇:2_27刷題小結
