李斌 郭景維 彭騫
摘 ? 要:針對(duì)HBase缺乏二級(jí)索引的功能,導(dǎo)致在非行鍵列上的查詢需要使用過(guò)濾器并配合全表掃描完來(lái)完成。在大數(shù)據(jù)的場(chǎng)景下性能較差的問(wèn)題,結(jié)合HBase表行鍵的索引結(jié)構(gòu)與關(guān)系型數(shù)據(jù)庫(kù)的二級(jí)索引結(jié)構(gòu)提出了索引列值聚集的二級(jí)索引解決方案。此外,還提出二級(jí)索引機(jī)制的支持聯(lián)合索引與特殊的索引列值的處理,提高了二級(jí)索引的性能并拓寬了二級(jí)索引的適用場(chǎng)景。最后,通過(guò)構(gòu)建系統(tǒng)測(cè)試證明了二級(jí)索引極大地提高了HBase的查詢效率。
關(guān)鍵詞:計(jì)算機(jī)軟件;HBase;二級(jí)索引;聚集;轉(zhuǎn)義
中圖分類號(hào): TP311.1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
Design of HBase Secondary indexes for big Data Storage
LI Bin?覮,GUO Jing-wei,PENG Qian
(State Grid Ningxia Electric Power Co. Ltd.,Yinchuan,Ningxia 750011,China)
Abstract: Due to the lack of secondary indexes in HBase,queries on non-row key columns need to use filters and complete the scan in the full table. In the scenario of massive data,the performance is poor. relational database proposes combining the indexes of HBase table row keys. With the secondary index structure of the structure a secondary index solution for index column value aggregation is proposed. In addition,this paper studies that the secondary index mechanism supports the processing of joint indexes and special index column values,improves the performance of the secondary index and broadens the application of the secondary index. Finally,this paper proves that the secondary index greatly improves the HBase query efficiency by building system tests.
Key words: computer software;HBase;secondary index;aggregation;escape
隨著Web2.0時(shí)代的蓬勃發(fā)展和移動(dòng)互聯(lián)網(wǎng)的快速普及,互聯(lián)網(wǎng)的數(shù)量呈現(xiàn)爆炸增長(zhǎng)的趨勢(shì)。根據(jù)IDC的預(yù)測(cè),截止到2021年,互聯(lián)網(wǎng)上的數(shù)據(jù)將增加到90ZB[1]。在大數(shù)據(jù)的場(chǎng)景下,單機(jī)的數(shù)據(jù)庫(kù)無(wú)法滿足存儲(chǔ)的要求,而關(guān)系型數(shù)據(jù)庫(kù)的架構(gòu)導(dǎo)致其水平擴(kuò)展能力不足[2],實(shí)現(xiàn)分布式存儲(chǔ)較為困難。在此場(chǎng)景下,分布式的非關(guān)系型數(shù)據(jù)庫(kù)通過(guò)摒棄關(guān)系型數(shù)據(jù)庫(kù)的部分關(guān)系模型特性[3],實(shí)現(xiàn)了易于擴(kuò)展和高性能讀寫的特點(diǎn),解決了關(guān)系型數(shù)據(jù)庫(kù)難以處理大數(shù)據(jù)存儲(chǔ)的問(wèn)題。其中HBase是雅虎公司牽頭,根據(jù)Google的BigTable模型[4]實(shí)現(xiàn)的一個(gè)開(kāi)源列式存儲(chǔ)數(shù)據(jù)庫(kù),擁有良好的擴(kuò)展性并且適合大規(guī)模數(shù)據(jù)的讀寫。此外,列存儲(chǔ)相比于行存儲(chǔ)來(lái)說(shuō),同一列的數(shù)據(jù)在磁盤上是聚集存儲(chǔ)的。數(shù)據(jù)分析往往只會(huì)使用表的若干列,所以列存儲(chǔ)的方式可以通過(guò)磁盤順序讀取的優(yōu)勢(shì)使用較少量的磁盤IO完成數(shù)據(jù)的讀取,而行存儲(chǔ)的方式則會(huì)因?yàn)樽x取整行而讀入過(guò)多的無(wú)用的列,導(dǎo)致大量的磁盤IO開(kāi)銷[5],所以HBase更適合數(shù)據(jù)分析型的業(yè)務(wù)。
雖然HBase擁有良好的擴(kuò)展性并且適合大規(guī)模數(shù)據(jù)的讀寫,但是也存在以一些缺陷,其中最主要的是不支持二級(jí)索引[6]。雖然HBase表的行鍵上擁有索引結(jié)構(gòu),但是在列上不支持創(chuàng)建二級(jí)索引[7],對(duì)于非行鍵列的條件查詢必須使用過(guò)濾器配合全表掃描的方式來(lái)完成,在數(shù)據(jù)量極大的情況下全表掃描的效率極低[8],無(wú)法滿足實(shí)時(shí)查詢的要求。
針對(duì)該問(wèn)題,在深入研究關(guān)系型數(shù)據(jù)庫(kù)B+tree索引結(jié)構(gòu)與HBase行鍵索引結(jié)構(gòu)的基礎(chǔ)上提出了索引列值聚集形式的二級(jí)索引結(jié)構(gòu),通過(guò)將索引列值聚集在對(duì)應(yīng)索引表的行鍵上來(lái)構(gòu)建二級(jí)索引的結(jié)構(gòu),從整體上提高HBase整體的查詢性能。此外,實(shí)現(xiàn)的二級(jí)索引結(jié)構(gòu)支持除了支持單列索引之外還支持聯(lián)合索引,且能處理索引列為空值等特殊情況。
1 ? 二級(jí)索引的現(xiàn)有解決方案
本小節(jié)主要介紹HBase二級(jí)索引的現(xiàn)有解決方案,包括Solr和IHBase。
1.1 ? Solr
Solr是一個(gè)開(kāi)源的全文搜索引擎,能夠支持文本的高效搜索[9]。當(dāng)創(chuàng)建HBase索引時(shí),可以使用Solr來(lái)保存對(duì)應(yīng)的索引列值并創(chuàng)建倒排索引。當(dāng)基于索引列進(jìn)行查詢時(shí)通過(guò)Solr中維護(hù)的索引結(jié)構(gòu)來(lái)過(guò)濾出符合條件的行,然后再查詢HBase。
上面的方案的缺點(diǎn)是客戶端需要同時(shí)使用Solr以及HBase的API才能完成創(chuàng)建索引、查詢,增加了使用上的復(fù)雜性,且引入的Solr系統(tǒng)大大增加了系統(tǒng)的維護(hù)成本。此外,由于Solr使用的協(xié)議為HTTP,網(wǎng)絡(luò)通信性能相對(duì)較低[10]。
1.2 ? IHBase
IHBase方案通過(guò)攔截HBase中緩存MemStore寫滿時(shí)的刷盤事件,然后將該MemStore中的數(shù)據(jù)構(gòu)建索引并存在數(shù)據(jù)表的另一個(gè)列中,之后查詢的時(shí)候IHBase會(huì)根據(jù)索引列中的數(shù)據(jù)進(jìn)行加速查詢。其優(yōu)點(diǎn)是直接在HBase內(nèi)部進(jìn)行索引的創(chuàng)建,減少了網(wǎng)絡(luò)IO傳輸[11]。缺點(diǎn)是需要對(duì)HBase進(jìn)行重構(gòu),且當(dāng)MemStore沒(méi)有寫滿時(shí),其中的數(shù)據(jù)無(wú)法創(chuàng)建索引,可能導(dǎo)致數(shù)據(jù)的不一致。
2 ? HBase二級(jí)索引結(jié)構(gòu)設(shè)計(jì)
本小節(jié)首先介紹關(guān)系型數(shù)據(jù)庫(kù)使用的單列二級(jí)索引結(jié)構(gòu)和聯(lián)合二級(jí)索引結(jié)構(gòu),在此基礎(chǔ)上介紹HBase 索引列聚集的二級(jí)索引結(jié)構(gòu)。
2.1 ? 關(guān)系型數(shù)據(jù)庫(kù)索引結(jié)構(gòu)
2.1.1 ? 單列索引結(jié)構(gòu)
關(guān)系型數(shù)據(jù)庫(kù)的二級(jí)索引結(jié)構(gòu)一般使用B+tree來(lái)實(shí)現(xiàn)[12],結(jié)構(gòu)如圖1所示:
在圖1所示B+tree結(jié)構(gòu)二級(jí)索引中,葉子節(jié)點(diǎn)保存的是數(shù)據(jù)表行記錄的索引列值(如name)和對(duì)應(yīng)行記錄的數(shù)據(jù)表的主鍵(如id),非葉子節(jié)點(diǎn)保存索引值(索引值不一定是真實(shí)表中的數(shù)據(jù))和對(duì)應(yīng)的指針。根據(jù)該索引結(jié)構(gòu)查詢時(shí),每次根據(jù)查詢的值和非葉子節(jié)點(diǎn)的索引值進(jìn)行比較,根據(jù)指針對(duì)應(yīng)的值范圍選擇其中一個(gè)指針進(jìn)入到更深層的節(jié)點(diǎn)(例如查詢條件為name=“Eric”時(shí),根據(jù)Root節(jié)點(diǎn)的信息計(jì)算出“Alice” < “Eric” < “Sally”,因此選擇P2指針進(jìn)入到N2節(jié)點(diǎn)中)。最后遍歷到葉子節(jié)點(diǎn)后獲得對(duì)應(yīng)的記錄的列值以及主鍵,如果篩選的列不在索引結(jié)構(gòu)中,則需要根據(jù)主鍵id去原始的數(shù)據(jù)表中查詢篩選的列。
在B+tree索引結(jié)構(gòu)中,每次遍歷到深層的節(jié)點(diǎn)后,可以將剩余的節(jié)點(diǎn)剪枝,由于B+tree是平衡的多叉樹(shù),因此圖1中每次進(jìn)入到深層的節(jié)點(diǎn)后可以剪枝其余2/3的節(jié)點(diǎn),最后的時(shí)間復(fù)雜度為3O(logN),相比于全表遍歷的O(N)時(shí)間復(fù)雜度,查詢性能提升較大。
2.1.2 ? 聯(lián)合索引結(jié)構(gòu)
聯(lián)合索引是指一個(gè)索引結(jié)構(gòu)中有多個(gè)索引列的索引,在多條件查詢時(shí)聯(lián)合索引只需要遍歷一個(gè)索引樹(shù)結(jié)構(gòu),因此磁盤IO開(kāi)銷比使用多個(gè)單列索引進(jìn)行查詢的磁盤IO開(kāi)銷少[13]。
索引的結(jié)構(gòu)和單列索引類似,結(jié)構(gòu)如圖2所示:
圖2是非主鍵列(age和salary)的聯(lián)合索引結(jié)構(gòu),葉子節(jié)點(diǎn)保存的是索引列值的元組和數(shù)據(jù)表的主鍵。非葉子節(jié)點(diǎn)保存的是索引列的列值元組(索引值不一定是真實(shí)表中的數(shù)據(jù),例如圖2中Root節(jié)點(diǎn)的元組(18,3)和(35,8)不是真實(shí)的數(shù)據(jù))和對(duì)應(yīng)的指針。元組之間的大小由索引列從左到右優(yōu)先級(jí)依次降低的方式確定(優(yōu)先按照左邊的列值進(jìn)行比較,相等再按后續(xù)列值比較)。圖2的索引結(jié)構(gòu)中,索引值的大小為(18,3) < (21,5) < (32,3)。
根據(jù)聯(lián)合索引查詢結(jié)構(gòu)進(jìn)行查詢的過(guò)程和單列索引類似,每次根據(jù)查詢條件和非葉子節(jié)點(diǎn)中的元組值進(jìn)行比較,然后選擇對(duì)應(yīng)的指針進(jìn)入深層次的節(jié)點(diǎn),直到獲取葉子節(jié)點(diǎn)中的數(shù)據(jù),圖2所示的聯(lián)合索引結(jié)構(gòu)的查詢時(shí)間復(fù)雜度也為3O(logN)。
2.2 ? HBase二級(jí)索引結(jié)構(gòu)
根據(jù)關(guān)系型數(shù)據(jù)庫(kù)的二級(jí)索引結(jié)構(gòu),提出了索引列聚集的二級(jí)索引結(jié)構(gòu),通過(guò)將索引列的列值聚集索引表的行鍵上來(lái)構(gòu)建HBase的二級(jí)索引。原始數(shù)據(jù)表如表1所示。
表2所示的單列索引使用“列值_數(shù)據(jù)表行鍵”的形式(“_”為分隔符)進(jìn)行構(gòu)建。由于HBase表的行鍵上自帶有類似于B+tree的LSM-tree索引結(jié)構(gòu)[14],因此構(gòu)建之后的索引表行鍵索引結(jié)構(gòu)如圖3所示:
根據(jù)圖3,二級(jí)索引結(jié)構(gòu)以聚集的方式將Col1列相同的的列值聚集在一起,并根據(jù)HBase表行鍵來(lái)自動(dòng)構(gòu)建索引。當(dāng)基于索引列查詢時(shí),通過(guò)查詢條件構(gòu)建索引表的行鍵前綴即可利用索引來(lái)實(shí)現(xiàn)查詢效率的提高(例如查詢“Col1=‘B”時(shí),構(gòu)建前綴“B”即可以使用圖3所示的二級(jí)索引結(jié)構(gòu)進(jìn)行數(shù)據(jù)的剪枝和高效查詢)。
表3所示的聯(lián)合索引使用“列值1_列值2_..._列值n_數(shù)據(jù)表行鍵”的形式構(gòu)造。當(dāng)基于聯(lián)合索引進(jìn)行查詢時(shí),也是根據(jù)查詢條件構(gòu)建索引表行鍵的前綴,使用索引進(jìn)行數(shù)據(jù)的過(guò)濾。由于聯(lián)合索引是按照索引列從左到右優(yōu)先級(jí)降低的順序排序的,因此當(dāng)某個(gè)索引列的列值確定后,該索引列的后繼索引列是有序的(例如在表3中,當(dāng)Col1列的列值確定為B后,對(duì)應(yīng)范圍內(nèi)的Col2列的列值有序),因此除了基于完整的聯(lián)合索引結(jié)構(gòu)的查詢之外,還可以基于聯(lián)合索引的前綴索引進(jìn)行查詢(例如查詢條件為“Col1=‘A”也可以使用表3所示的聯(lián)合索引,因?yàn)镃ol1列整體在索引結(jié)構(gòu)中有序)。
3 ? 空列值與分隔符預(yù)處理、解析
表2和表3展示了一般情況下HBase二級(jí)索引的結(jié)構(gòu),但是當(dāng)列值為空或者列值中存在分隔符“_”時(shí),直接根據(jù)構(gòu)造索引表行鍵可能會(huì)導(dǎo)致后續(xù)出現(xiàn)解析錯(cuò)誤。例如索引列為(Col1,Col2,Col3,Col4),數(shù)據(jù)行中對(duì)應(yīng)的列值分別為“v1”,“v2”,空值,以及“v\”,行鍵為“001”。
如果直接構(gòu)建索引表行鍵,則構(gòu)造的結(jié)果為“v1_v2__v\_001”,后續(xù)基于該行鍵查詢時(shí)會(huì)出現(xiàn)解析錯(cuò)誤。
基于以上的問(wèn)題,本文提出了轉(zhuǎn)義和替換的方案,使用轉(zhuǎn)義符(單個(gè)字符,記為“\”)和空值替換符(單個(gè)字符,記為“N”)的方案來(lái)處理上述的問(wèn)題。
3.1 ? 索引表行鍵預(yù)處理
預(yù)處理在構(gòu)建索引表行鍵之前先通過(guò)“N”和“\”對(duì)數(shù)據(jù)進(jìn)行處理,避免后續(xù)可能發(fā)生的解析錯(cuò)誤問(wèn)題。此處轉(zhuǎn)義和替換的策略為:
1.使用“N”替換空值。
2.使用“\”將列值中已有的“\”和“_”轉(zhuǎn)義為“\\”和“\_”,并將單獨(dú)的“N”轉(zhuǎn)義為“\N”。
其中使用“\”來(lái)將單獨(dú)的“N”進(jìn)行轉(zhuǎn)義的原因是可能存在列值和“N”相同(非空),不額外處理會(huì)和代表空值的“N”混淆,故此處加上'\”來(lái)進(jìn)行轉(zhuǎn)義。如果原先的字節(jié)值為“\N”,則會(huì)根據(jù)策略2 轉(zhuǎn)換為“\\N”。
使用“\”來(lái)轉(zhuǎn)義列值中的“\”和“_”是將列值中作為實(shí)際數(shù)據(jù)的“\”和“_”進(jìn)行特殊的標(biāo)記,防止和真正的轉(zhuǎn)義符“\”或者分隔符“_”混淆。
當(dāng)完成了上面的流程后,使用拼接的策略將索引列進(jìn)行拼接得到索引表的行鍵。本小節(jié)開(kāi)頭的例子經(jīng)過(guò)預(yù)處理和拼接后,得到的結(jié)果為“v1_v\2_N_v\\_001”。
3.2 ? 行鍵解析
當(dāng)通過(guò)索引表查詢獲得行鍵后,需要將之前轉(zhuǎn)義和替換的特殊字符去除以便進(jìn)行列值的解析,以便后續(xù)的進(jìn)一步查詢。此處解析的流程為:
1. 當(dāng)遍歷遇到轉(zhuǎn)義符“\”時(shí),說(shuō)明是真正的轉(zhuǎn)義符。如果后一個(gè)字符是“N”,則保留“N”以及該轉(zhuǎn)義符,并一起拷貝到臨時(shí)緩沖區(qū)中;如果后一個(gè)字符不是“N”可以丟棄該轉(zhuǎn)義符并拷貝后一個(gè)字符到臨時(shí)緩沖區(qū)中(例如“\\”和“\_”都丟棄第一個(gè)“\”并拷貝后面的字符,而“\N”的情況不丟棄“\”完整拷貝)。通過(guò)對(duì)真正轉(zhuǎn)義符的處理,將被轉(zhuǎn)義的字符作為真實(shí)的數(shù)據(jù)字符處理,避免了解析錯(cuò)誤。
2.當(dāng)遇到分隔符“_”時(shí),說(shuō)明是真正的分隔符(如果是數(shù)據(jù)中的分隔符則已經(jīng)根據(jù)第1步將其拷貝到臨時(shí)緩沖區(qū)),可以直接跳過(guò)并將之前拷貝的臨時(shí)緩沖區(qū)對(duì)應(yīng)到具體的列值上。如果臨時(shí)緩沖區(qū)是“N”則設(shè)置對(duì)應(yīng)的列值為空(原先列值為“N”根據(jù)條件1可以推出對(duì)應(yīng)臨時(shí)緩沖區(qū)中為“\N”,不會(huì)和空值混淆),其他的內(nèi)容直接轉(zhuǎn)換。
3.遇到其他字符時(shí),說(shuō)明是具體的數(shù)據(jù),直接拷貝到臨時(shí)緩沖區(qū)中。
當(dāng)根據(jù)上面的步驟處理完一個(gè)索引表行鍵后,就可以得到分隔的索引列值以及最后的數(shù)據(jù)表行鍵,用于后面的進(jìn)一步查詢。
4 ? 基于二級(jí)索引結(jié)構(gòu)的查詢流程
當(dāng)查詢的列為行鍵列時(shí),直接使用HBase原有的查詢功能即可實(shí)現(xiàn),不需要經(jīng)過(guò)專門的二級(jí)索引表進(jìn)行數(shù)據(jù)過(guò)濾。
當(dāng)查詢的列為非行鍵列時(shí),需要根據(jù)二級(jí)索引進(jìn)行數(shù)據(jù)的過(guò)濾,二級(jí)索引功能在單獨(dú)的索引服務(wù)端中實(shí)現(xiàn)(索引表仍然保存在HBase中)?;诜切墟I列的查詢過(guò)程如圖4所示:
在圖4所示的查詢過(guò)程中,客戶端首先將查詢請(qǐng)求發(fā)送給二級(jí)索引服務(wù)端,服務(wù)端根據(jù)查詢條件和維護(hù)的表索引信息計(jì)算出命中的索引,然后根據(jù)預(yù)處理過(guò)程處理查詢條件并構(gòu)建索引表行鍵前綴,然后使用HBase查詢的API去索引表中查詢符合客戶端查詢條件的行鍵。
如果查詢請(qǐng)求中篩選的列已經(jīng)在索引結(jié)構(gòu)中,則直接構(gòu)建結(jié)果返回(例如客戶端查詢的列為Col1,查詢條件為“Col1 >= ‘A”,且該列有索引,則直接根據(jù)索引表的行鍵構(gòu)建結(jié)果)。
如果查詢請(qǐng)求中篩選的列不在索引結(jié)構(gòu)中(例如查詢的列為Col3,索引結(jié)構(gòu)包含的列為Col2),則需要提取出索引表行鍵中的數(shù)據(jù)表行鍵去數(shù)據(jù)表中查詢對(duì)應(yīng)行的待篩選列信息(如圖4的alt可選部分)。由于數(shù)據(jù)表的查詢是基于有索引的行鍵,因此效率很高。
當(dāng)完成了所有的查詢步驟之后,服務(wù)端構(gòu)建完整的結(jié)果返回給客戶端。
5 ? 實(shí) ? 驗(yàn)
本小節(jié)主要介紹HBase二級(jí)索引的實(shí)驗(yàn),包括數(shù)據(jù)與環(huán)境、實(shí)驗(yàn)的設(shè)計(jì)以及結(jié)果與分析。
5.1 ? 實(shí)驗(yàn)的數(shù)據(jù)與環(huán)境
該系統(tǒng)使用阿里媽媽在天池開(kāi)放的廣告數(shù)據(jù)集作為實(shí)驗(yàn)數(shù)據(jù)。其中廣告的點(diǎn)擊數(shù)據(jù)包含了8天內(nèi)共計(jì)114萬(wàn)用戶的1600萬(wàn)次廣告展示或者點(diǎn)擊的日志記錄。其中包括的信息有user_id(用戶的ID),adgroup_id(廣告單元ID),time_stamp(時(shí)間戳),clk(是否點(diǎn)擊)。
實(shí)驗(yàn)的環(huán)境包括3臺(tái)CentOS 6.6虛擬機(jī),每個(gè)虛擬機(jī)為單核單線程、2.1GHZ主頻的CPU,4G內(nèi)存。在每臺(tái)虛擬機(jī)上上安裝Hadoop2.6.0,HBase1.0.1以及Zookeeper 3.4.6組成HBase集群。二級(jí)索引的服務(wù)端和客戶端均運(yùn)行在另一臺(tái)虛擬機(jī)上,配置相同。
5.2 ? 實(shí)驗(yàn)的設(shè)計(jì)
實(shí)驗(yàn)從整體上分為寫入和查詢共兩種測(cè)試,測(cè)試指標(biāo)分別為寫入操作的系統(tǒng)響應(yīng)時(shí)間和查詢操作的系統(tǒng)響應(yīng)時(shí)間。在每種測(cè)試內(nèi)部,分別使用10萬(wàn),100萬(wàn)和1000萬(wàn)的數(shù)據(jù)量以及無(wú)索引、單個(gè)單列索引,單個(gè)聯(lián)合索引進(jìn)行性能測(cè)試。
5.3 ? 實(shí)驗(yàn)的結(jié)果與分析
數(shù)據(jù)的寫入的實(shí)驗(yàn)分別在不同的數(shù)據(jù)量和不同的索引結(jié)構(gòu)下進(jìn)行數(shù)據(jù)寫入,數(shù)據(jù)寫入的實(shí)驗(yàn)結(jié)果如下表4所示:
表4中,在索引固定的情況下,隨著寫入數(shù)據(jù)量的增長(zhǎng),寫入的耗時(shí)也隨之增加,兩者接近線性的關(guān)系。而在寫入數(shù)據(jù)量固定時(shí),隨著索引的加入或者索引的結(jié)構(gòu)變得復(fù)雜(如聯(lián)合索引的結(jié)構(gòu)比單列索引復(fù)雜),寫入的時(shí)間也隨之增加,這是因?yàn)榉?wù)端需要單獨(dú)維護(hù)索引表信息,故增加了寫入的時(shí)間。例如單個(gè)索引的加入使得寫入的時(shí)間增加了大約在40%,而聯(lián)合索引由于索引結(jié)構(gòu)更加復(fù)雜,寫入時(shí)間的增加也更明顯,達(dá)到了60%。由于大批量寫入的情況較少,而在小數(shù)據(jù)量寫入的時(shí)候,寫入開(kāi)銷增加40%至60%帶來(lái)的延遲較小,因此該結(jié)果也在可接受的范圍內(nèi)。
數(shù)據(jù)查詢的實(shí)驗(yàn)分別在不同的數(shù)據(jù)量下,使用不同的索引結(jié)構(gòu)進(jìn)行非行鍵列的等值查詢(例如“user_id=1025”,無(wú)索引使用和單個(gè)索引相同的查詢條件,聯(lián)合索引使用完整的結(jié)構(gòu)索引結(jié)構(gòu)進(jìn)行等值查詢),實(shí)驗(yàn)結(jié)果如表5所示:
表5中,在索引結(jié)構(gòu)固定的的情況下,數(shù)據(jù)的查詢速度和數(shù)據(jù)量呈現(xiàn)線性的關(guān)系,這是因?yàn)樵跓o(wú)索引的情況下,非行鍵列的查詢需要通過(guò)全表掃描來(lái)實(shí)現(xiàn)。而在查詢的列上建立的索引后,查詢的效率有了極大的提高,這是因?yàn)楦鶕?jù)本文的索引聚集的策略,索引列聚集在索引表的行鍵上,而HBase表的行鍵自帶LSM-tree的索引結(jié)構(gòu),因此可以通過(guò)構(gòu)建索引表的行鍵前綴來(lái)利用索引結(jié)構(gòu)將查詢的時(shí)間復(fù)雜度縮減到O(logN)級(jí)別。
6 ? 結(jié) ? 論
提出了索引列值聚集形式的二級(jí)索引結(jié)構(gòu),通過(guò)將索引列值在索引表的行鍵上聚集實(shí)現(xiàn)了HBase的二級(jí)索引結(jié)構(gòu),并且能夠支持單列索引以及聯(lián)合索引,使得非行鍵列的查詢能夠利用已有的二級(jí)索引結(jié)構(gòu)來(lái)加快查詢的效率。此外,使用特殊的轉(zhuǎn)移符“\”和空值替換符“N”完成了索引列值包含分隔符以及索引列值為空兩種特殊情況的處理,使得提出的二級(jí)索引結(jié)構(gòu)適用的范圍更加廣闊。最后,通過(guò)對(duì)比實(shí)驗(yàn)證明了提出的索引結(jié)構(gòu)極大地提升了HBase非行鍵列查詢的效率。
參考文獻(xiàn)
[1] ? ?陳墨,程剛,王小娟.基于互聯(lián)網(wǎng)海量數(shù)據(jù)的熱點(diǎn)分析系統(tǒng)研究[J].互聯(lián)網(wǎng)天地,2015(09):30—35.
[2] ? ?金澈清,錢衛(wèi)寧,周敏奇,等.數(shù)據(jù)管理系統(tǒng)評(píng)測(cè)基準(zhǔn):從傳統(tǒng)數(shù)據(jù)庫(kù)到新興大數(shù)據(jù)[J].計(jì)算機(jī)學(xué)報(bào),2015,38(01):18—34.
[3] ? ?李紹俊,楊海軍,黃耀歡,等.基于NoSQL數(shù)據(jù)庫(kù)的空間大數(shù)據(jù)分布式存儲(chǔ)策略[J].武漢大學(xué)學(xué)報(bào):信息科學(xué)版,2017,42(02):163—169.
[4] ? ?魏玲,魏永江,高長(zhǎng)元.基于Bigtable與MapReduce的Apriori算法改進(jìn)[J].計(jì)算機(jī)科學(xué),2015,42(10):208-210+243.
[5] ? ?余林琛,廖小飛.多虛擬機(jī)環(huán)境下磁盤寫優(yōu)化機(jī)制[J].計(jì)算機(jī)工程與科學(xué),2012,34(10):78—82.
[6] ? ?崔丹,史金鑫.基于Redis實(shí)現(xiàn)HBase二級(jí)索引的方法[J].軟件,2016,37(11):64—67.
[7] ? ?李聰穎,王瑞剛,于金良.大數(shù)據(jù)分布式全文檢索系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程,2016,44(12):2426—2430.
[8] ? ?畢冉,李建中,高宏.無(wú)線傳感器網(wǎng)絡(luò)中最小化通信開(kāi)銷的近似監(jiān)測(cè)算法[J].計(jì)算機(jī)學(xué)報(bào),2015,38(10):2092—2105.
[9] ? ?王文賢,陳興蜀,王海舟,等.一種基于Solr的HBase海量數(shù)據(jù)二級(jí)索引方案[J].信息網(wǎng)絡(luò)安全,2017(08):39—44.
[10] ?許杰,冷冰,李明桂,等.大數(shù)據(jù)處理技術(shù)在安全審計(jì)系統(tǒng)中的應(yīng)用[J].通信技術(shù),2016,49(03):346—351.
[11] ?唐長(zhǎng)城,楊峰,代棟,等.一種基于HBase的數(shù)據(jù)持久性和可用性研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,22(10): 175—180.
[12] ?CIMERMANCIC P,MEDEMA M H,CLAESEN J,et al. Insights into secondary metabolism from a global analysis of prokaryotic biosynthetic gene clusters[J]. Cell,2014,158(2): 412—421.
[13] ?宋傳鳴,陳規(guī)勝,何興,等.調(diào)色板編碼中雙向預(yù)測(cè)的索引值優(yōu)化分配[J].模式識(shí)別與人工智能,2017,30(05):385—393.
[14] ?YUE Y,HE B,LI Y,et al. Building an efficient put-intensive key-value store with skip-tree[J]. IEEE Transactions on Parallel and Distributed Systems,2017,28(4): 961—973.