HBase二級(jí)索引方案
01 HBase簡(jiǎn)介
HBase是一個(gè)構(gòu)建在HDFS之上,用于海量數(shù)據(jù)存儲(chǔ)分布式列存儲(chǔ)系統(tǒng)。
參見(jiàn)下圖,由于在HBase中:
表的每行都是按照RowKey的字典序排序存儲(chǔ)
表的數(shù)據(jù)是按照RowKey區(qū)間進(jìn)行分割存儲(chǔ)成多個(gè)region
所以HBase主要適用下面這兩種常見(jiàn)場(chǎng)景:
適用于基于rowkey的單行數(shù)據(jù)快速隨機(jī)讀寫(xiě)
適合基于rowkey前綴的范圍掃描
02 為什么需要HBse二級(jí)索引
HBase里面只有rowkey作為一級(jí)索引, 如果要對(duì)庫(kù)里的非rowkey字段進(jìn)行數(shù)據(jù)檢索和查詢(xún), 往往要通過(guò)MapReduce/Spark等分布式計(jì)算框架進(jìn)行,硬件資源消耗和時(shí)間延遲都會(huì)比較高。
為了HBase的數(shù)據(jù)查詢(xún)更高效、適應(yīng)更多的場(chǎng)景, 諸如使用非rowkey字段檢索也能做到秒級(jí)響應(yīng),或者支持各個(gè)字段進(jìn)行模糊查詢(xún)和多字段組合查詢(xún)等, 因此需要在HBase上面構(gòu)建二級(jí)索引, 以滿(mǎn)足現(xiàn)實(shí)中更復(fù)雜多樣的業(yè)務(wù)需求。
03 HBse二級(jí)索引方案
基于Coprocessor方案
1、官方特性
其實(shí)從0.94版本開(kāi)始,HBase官方文檔已經(jīng)提出了hbase上面實(shí)現(xiàn)二級(jí)索引的一種路徑:
基于Coprocessor(0.92版本開(kāi)始引入,達(dá)到支持類(lèi)似傳統(tǒng)RDBMS的觸發(fā)器的行為)
開(kāi)發(fā)自定義數(shù)據(jù)處理邏輯,采用數(shù)據(jù)“雙寫(xiě)”(dual-write)策略,在有數(shù)據(jù)寫(xiě)入同時(shí)同步到二級(jí)索引表
2、開(kāi)源方案:
雖然官方一直也沒(méi)提供內(nèi)置的支持二級(jí)索引的工具, 不過(guò)業(yè)界也有些比較知名的基于Coprocessor的開(kāi)源方案:
華為的hindex : 基于0.94版本,當(dāng)年剛出來(lái)的時(shí)候比較火,但是版本較舊,看GitHub項(xiàng)目地址最近這幾年就沒(méi)更新過(guò)。
Apache Phoenix: 功能?chē)@著SQL on hbase,支持和兼容多個(gè)hbase版本, 二級(jí)索引只是其中一塊功能。 二級(jí)索引的創(chuàng)建和管理直接有SQL語(yǔ)法支持,使用起來(lái)很簡(jiǎn)便, 該項(xiàng)目目前社區(qū)活躍度和版本更新迭代情況都比較好。
ApachePhoenix在目前開(kāi)源的方案中,是一個(gè)比較優(yōu)的選擇。主打SQL on HBase , 基于SQL能完成HBase的CRUD操作,支持JDBC協(xié)議。 Apache Phoenix在Hadoop生態(tài)里面位置:
3、Phoenix二級(jí)索引特點(diǎn):
Covered Indexes(覆蓋索引) :把關(guān)注的數(shù)據(jù)字段也附在索引表上,只需要通過(guò)索引表就能返回所要查詢(xún)的數(shù)據(jù)(列), 所以索引的列必須包含所需查詢(xún)的列(SELECT的列和WHRER的列)。
Functional indexes(函數(shù)索引): 索引不局限于列,支持任意的表達(dá)式來(lái)創(chuàng)建索引。
Global indexes(全局索引):適用于讀多寫(xiě)少場(chǎng)景。通過(guò)維護(hù)全局索引表,所有的更新和寫(xiě)操作都會(huì)引起索引的更新,寫(xiě)入性能受到影響。 在讀數(shù)據(jù)時(shí),Phoenix SQL會(huì)基于索引字段,執(zhí)行快速查詢(xún)。
Local indexes(本地索引):適用于寫(xiě)多讀少場(chǎng)景。 在數(shù)據(jù)寫(xiě)入時(shí),索引數(shù)據(jù)和表數(shù)據(jù)都會(huì)存儲(chǔ)在本地。在數(shù)據(jù)讀取時(shí), 由于無(wú)法預(yù)先確定region的位置,所以在讀取數(shù)據(jù)時(shí)需要檢查每個(gè)region(以找到索引數(shù)據(jù)),會(huì)帶來(lái)一定性能(網(wǎng)絡(luò))開(kāi)銷(xiāo)。
其他的在網(wǎng)上也很多自己基于Coprocessor實(shí)現(xiàn)二級(jí)索引的文章,大體都是遵循類(lèi)似的思路:構(gòu)建一份“索引”的映射關(guān)系,存儲(chǔ)在另一張hbase表或者其他DB里面。
4、方案優(yōu)缺點(diǎn):
優(yōu)點(diǎn): 基于Coprocessor的方案,從開(kāi)發(fā)設(shè)計(jì)的角度看, 把很多對(duì)二級(jí)索引管理的細(xì)節(jié)都封裝在的Coprocessor具體實(shí)現(xiàn)類(lèi)里面, 這些細(xì)節(jié)對(duì)外面讀寫(xiě)的人是無(wú)感知的,簡(jiǎn)化了數(shù)據(jù)訪問(wèn)者的使用。
缺點(diǎn): 但是Coprocessor的方案入侵性比較強(qiáng), 增加了在Regionserver內(nèi)部需要運(yùn)行和維護(hù)二級(jí)索引關(guān)系表的代碼邏輯等,對(duì)Regionserver的性能會(huì)有一定影響。
非Coprocessor方案
選擇不基于Coprocessor開(kāi)發(fā),自行在外部構(gòu)建和維護(hù)索引關(guān)系也是另外一種方式。
常見(jiàn)的是采用底層基于Apache Lucene的Elasticsearch(下面簡(jiǎn)稱(chēng)ES)或Apache Solr ,來(lái)構(gòu)建強(qiáng)大的索引能力、搜索能力, 例如支持模糊查詢(xún)、全文檢索、組合查詢(xún)、排序等。
1、Lily HBase Indexer:
LilyHBase Indexer(也簡(jiǎn)稱(chēng) HBase Indexer)是國(guó)外的NGDATA公司開(kāi)源的基于solr的索引構(gòu)建工具, 特色是其基于HBase的備份機(jī)制,開(kāi)發(fā)了一個(gè)叫SEP工具, 通過(guò)監(jiān)控HBase 的WAL日志(Put/Delete操作),來(lái)觸發(fā)對(duì)solr集群索引的異步更新, 基本對(duì)HBase無(wú)侵入性(但必須開(kāi)啟WAL ), 流程圖如下所示:
2、CDH Search:
CDHSearch是Hadoop發(fā)行商Cloudera公司開(kāi)發(fā)的基于solr的HBase檢索方案,部分集成了Lily HBase Indexer的功能。
下面是CDH search的核心組件交互圖, 體現(xiàn)了在單次client端查詢(xún)過(guò)程中,核心的zookeeper和solr等的交互流程:
3、CDH 支持構(gòu)建索引方式:
批量索引:
使用 Spark :CDH自帶 spark 批量index工具
使用MapReduce :集成Lily Indexer、自帶MR index等工具
近實(shí)時(shí)索引(增量場(chǎng)景):
使用 Flume 近實(shí)時(shí)(NRT)索引
集成Lily NRT Indexer
基于Solr REST API自定義索引場(chǎng)景
4、CDH Solr 索引查詢(xún)流程示意圖:
04 DataStory二級(jí)索引方案介紹
其實(shí)對(duì)于在外部自定義構(gòu)建二級(jí)索引的方式, 有自己的大數(shù)據(jù)團(tuán)隊(duì)的公司一般都會(huì)針對(duì)自己的業(yè)務(wù)場(chǎng)景進(jìn)行優(yōu)化,自行構(gòu)建ES/Solr的搜索集群。 例如數(shù)說(shuō)故事企業(yè)內(nèi)部的百億級(jí)數(shù)據(jù)全量庫(kù),就是基于ES構(gòu)建海量索引和檢索能力的案例。 主要優(yōu)化點(diǎn)包括:
對(duì)企業(yè)的索引集群面向的業(yè)務(wù)場(chǎng)景和模式定制,對(duì)通用數(shù)據(jù)模型進(jìn)行抽象和平臺(tái)化復(fù)用
需要針對(duì)多業(yè)務(wù)、多項(xiàng)目場(chǎng)景進(jìn)行ES集群資源的合理劃分和運(yùn)維管理
查詢(xún)需要針對(duì)多索引集群、跨集群查詢(xún)進(jìn)行優(yōu)化
共用集群場(chǎng)景需要做好防護(hù)、監(jiān)控、限流
下面顯示了數(shù)說(shuō)基于ES做二級(jí)索引的兩種構(gòu)建流程,包含:
增量索引: 日常持續(xù)接入的數(shù)據(jù)源,進(jìn)行增量的索引更新
全量索引: 配套基于Spark/MR的批量索引創(chuàng)建/更新程序, 用于初次或重建已有HBase庫(kù)表的索引
數(shù)據(jù)查詢(xún)流程:
Datastory在做全量庫(kù)的過(guò)程中,還是有更多遇到的問(wèn)題要解決,諸如數(shù)據(jù)一致性、大量小索引、多版本ES集群共存等, 會(huì)在后續(xù)進(jìn)行更細(xì)致的介紹和分享。
參考資料:
HBase coprocessor:
https://blogs.apache.org/hbase/entry/coprocessor_introduction
Cloudera Search:
https://www.cloudera.com/documentation/enterprise/5-14-x/topics/search.html
Apache Phoenix Secondary indexing:
https://phoenix.apache.org/secondary_indexing.html
NGDATA Lily HBase Indexer:
https://github.com/NGDATA/hbase-indexer/wiki
https://www.ngdata.com/the-hbase-side-effect-processor-and-hbase-replication-monitoring/
深入理解HBase Indexer:
https://blog.csdn.net/d6619309/article/details/51500368
華為hindex:
https://github.com/Huawei-Hadoop/hindex
評(píng)論
評(píng)論
推薦評(píng)論
暫無(wú)評(píng)論哦,快來(lái)評(píng)論一下吧!
全部評(píng)論(0條)