王 飛 張 明 晏學(xué)義
中國聯(lián)合網(wǎng)絡(luò)通信有限公司濟南軟件研究院 濟南 250100
現(xiàn)代社會是一個高速發(fā)展的社會,科技發(fā)達,信息流通,人們之間的交流越來越密切,生活也越來越方便,大數(shù)據(jù)就是這個高科技時代的產(chǎn)物。數(shù)據(jù)的增長急需數(shù)據(jù)庫存儲容量的擴充,現(xiàn)有的關(guān)系型數(shù)據(jù)庫很難在硬件上滿足數(shù)據(jù)瘋狂增長的需要[1]。
Apache HBASE是一個高性能、分布式、面向列、可伸縮的開源分布式NoSQL數(shù)據(jù)庫,它不同于一般的關(guān)系型數(shù)據(jù)庫,是一個適合于非結(jié)構(gòu)化數(shù)據(jù)存儲的數(shù)據(jù)庫[2]。HBASE是基于ROWKEY(行鍵)的有序存儲,在明確ROWKEY的條件下HBASE支持毫秒級的快速檢索[3]。然而,隨著HBASE的應(yīng)用的不斷深入,單純通過ROWKEY檢索數(shù)據(jù)的方式不再滿足應(yīng)用的需求。
對于多字段的復(fù)雜檢索,如果無法通過ROWKEY檢索,則需對HBASE全表數(shù)據(jù)進行掃描,消耗大量時間,導(dǎo)致查詢效率極低。為此,業(yè)內(nèi)提出了建立HBASE二級索引的方案以提高多字段信息查詢效率。
目前,HBASE二級索引技術(shù)的方案中普遍存在兩大特點。
現(xiàn)有的HBASE二級索引方案都是根據(jù)查詢常用屬性創(chuàng)建索引表,這就意味著每個索引表都是建立在固定的屬性條件下的。因此,當實際調(diào)取某種多樣屬性信息時,需要按照多重屬性條件依次檢索不同的索引表。從不同的索引表中獲取的ROWKEY再進行比對去重,最終得到符合所有查詢條件的ROWKEY,然后再根據(jù)篩選出的ROWKEY在HBASE表進行提取,以完成多重條件信息的查詢。此種方案雖然避免了HBASE數(shù)據(jù)的全表掃描,節(jié)省了查詢時間,但需要根據(jù)不同的條件或條件組合創(chuàng)建多索引表,同時HBASE中的ROWKEY將會重復(fù)保存在不同索引表中,這將需要使用較大的存儲空間用以存放大量的索引表數(shù)據(jù)。
二級索引表是根據(jù)屬性條件建立的,因此當需要更新HBASE中的ROWKEY時,一旦ROWKEY中的數(shù)據(jù)內(nèi)容發(fā)生變化,就需要更新所涉及到的所有索引表。尤其當索引表較多或關(guān)聯(lián)關(guān)系較復(fù)雜時,勢必要消耗較高的成本來修改所有涉及的二級索引表。
鑒于以上二級索引的局限性,本文在兼顧多條件查詢效率的同時,最大化減少了存儲二級索引所占用的數(shù)據(jù)空間。在使用過程中如果HBASE發(fā)送小范圍數(shù)據(jù)變更無需修正本文所設(shè)計的二級索引內(nèi)容,也可保證數(shù)據(jù)查詢的準確性[4]。
位圖技術(shù)是一種常用的數(shù)據(jù)存儲方式,可以看作是存儲了大量bit位的bit序列,每個bit位都代表一個特定的屬性含義,bit位只有0/1兩種狀態(tài),分別代表屬性是否存在[5]。
本文利用位圖技術(shù)在內(nèi)存數(shù)據(jù)庫中以K-V形式存儲數(shù)據(jù)。其中“主屬性”保存在KEY中,而“從屬性”以位圖的形式保存在VALUE中。同時從屬性在位圖中的bit位需要另外用位圖字典來記錄,VAULE中實際顯示的是相關(guān)從屬性的具體值,即0或1。以圖1為例,手機號代表主屬性,VALUE中包含兩類從屬性,即手機號碼歸屬業(yè)務(wù)和手機號碼歸屬省份。兩類從屬性在VALUE中各占用一段存儲空間,分別保存著以位圖形式顯示的屬性數(shù)據(jù),即1或0[6]。
當使用HBASE位圖索引對HBASE進行查詢時,首先通過位圖索引完成用戶范圍的查找,然后根據(jù)用戶范圍在HBASE中完成最終數(shù)據(jù)的檢索,參見圖2。
圖2 HBASE位圖索引查詢圖
當需要查詢漫游到河南省的4 G 業(yè)務(wù)的總金額時,即查詢條件為多重查詢,包括省份查詢(河南省)及業(yè)務(wù)查詢(4G業(yè)務(wù)),首先根據(jù)位圖字典(如圖1所示)查到“河南省”在二級索引中的bit位置,即“河南省”在二級索引中的第2bit位,4G業(yè)務(wù)在二級索引中的第40 bit位。然后在內(nèi)存中檢索第2位和第40位都為“1”的用戶有哪些(1代表“是”,0代表“否”)。最終得到手機號碼1XX05316666和1XX05316667用戶符合查詢條件。然后再從H B A S E 中查詢手機號碼1XX05316666和1XX05316667的所有屬性,找出符合漫游到河南省的4 G 業(yè)務(wù)的數(shù)據(jù)并累加金額,得到總金額為1.59元。
圖1 位圖數(shù)據(jù)存儲和位圖字典對應(yīng)圖
HBASE位圖索引采用二次查詢的方式進行檢索,通過從位圖索引中檢索出數(shù)據(jù)范圍,然后根據(jù)數(shù)據(jù)范圍從HBASE中查詢出最終數(shù)據(jù)結(jié)果。
2.2.1 位圖索引創(chuàng)建
所述位圖索引的創(chuàng)建主要包含兩個步驟:位圖索引模板參數(shù)配置和REDIS內(nèi)存創(chuàng)建。位圖索引模板參數(shù)一般存放在主流的關(guān)系型數(shù)據(jù)庫中如Oracle;而REDIS內(nèi)存的創(chuàng)建需要四臺主機,形成一主三從的結(jié)構(gòu)(主節(jié)點用于更新,從節(jié)點用于查詢)。
所述位圖索引模板參數(shù)主要包含四張表:位圖大類表、位圖字典表、業(yè)務(wù)表、業(yè)務(wù)索引維度表。前兩張表的內(nèi)容對任何HBASE表格都是通用的,后兩張表的內(nèi)容是針對某特定HBASE表格而配置的。
位圖大類表主要用于記錄位圖索引包含哪些用于檢索的業(yè)務(wù)類。
位圖字典表主要用于記錄某業(yè)務(wù)類包含哪些屬性值。每個屬性值占用一位,每類業(yè)務(wù)創(chuàng)建一個位圖起止范圍,即位圖所占位數(shù)。起止范圍應(yīng)預(yù)留部分空bit位以減少屬性的增加對位圖索引的干擾,因為每當增加新的屬性值時會占用更多的bit位。
業(yè)務(wù)表主要用于記錄某HBASE表格的特定配置模板,主要包括表模板名、主屬性(如用戶)在HBASE表格中的位置(即處于哪個列族、列名)。
業(yè)務(wù)索引維度表主要記錄某HBASE表格所包含的檢索業(yè)務(wù)的配置信息。對于每個檢索業(yè)務(wù),主要記錄了該業(yè)務(wù)使用了位圖大類表中的哪個業(yè)務(wù)類,該檢索業(yè)務(wù)的屬性值位于HBASE表格中的位置(即處于哪個列族、列名)。
本文選用REDIS內(nèi)存數(shù)據(jù)庫存儲位圖索引[7],REDIS內(nèi)存庫采用主從模式進行部署。通過REDIS的主從模式對位圖索引進行讀寫分離,其中主機用于索引數(shù)據(jù)寫入,從機用于索引數(shù)據(jù)查詢。REDIS每條記錄的key包含了主屬性,而Value值即存放了該主屬性如用戶的位圖。
位圖索引創(chuàng)建時根據(jù)HBASE中的同一主屬性(如用戶)的多條數(shù)據(jù)信息生成此用戶的位圖數(shù)據(jù),然后將所有用戶的位圖屬性存儲到REDIS中,完成位圖索引的創(chuàng)建。位圖索引的數(shù)據(jù)量取決于HBASE中主屬性(如用戶)的數(shù)量,和HBASE中的數(shù)據(jù)總量無關(guān)。
2.2.2 位圖索引的更新
位圖索引的更新分為全量更新和增量更新。所述全量更新即為對某張完整的HBASE表的位圖索引重新創(chuàng)建;所述增量更新指隨著HBASE表的記錄增添而更新位圖索引的信息。
對于全量更新,僅僅需要對每個主屬性搜集位圖信息并記錄到REDIS即可。
對于增量更新,每當HBASE有新記錄插入時,需要對位圖索引進行更新。更新時,首先需要找到該記錄的主屬性值,然后生成該記錄的位圖。對于位圖中每個bit位為1的位都要在REDIS中進行設(shè)置,也就是將該記錄的位圖與REDIS中的舊位圖進行按位或運算后重新存入[8]。
2.2.3 查詢
總的查詢過程分為兩步:位圖索引查詢和HBASE查詢。
所述位圖索引查詢,即首先根據(jù)檢索條件生成檢索條件的位圖。然后根據(jù)位圖全量掃描REDIS內(nèi)存記錄,找到符合位圖記錄的主屬性(如用戶)。最后將所有用戶列表傳遞給接下來的處理程序——HBASE查詢。
HBASE根據(jù)用戶生成ROWKEY范圍,對每個ROWKEY范圍查詢。如果支撐多條主屬性的ROWKEY范圍查詢需要多個HBASE查詢連接進行,且因為用戶主屬性在HBASE分布式集群中存儲在不同的主機上,導(dǎo)致直接使用HBASE查詢接口是效率較低。為了加快HBASE中對多范圍數(shù)據(jù)的查詢效率,對HBASE做出以下優(yōu)化:
1)在每臺主機上部署查詢程序;
2)對用戶按存儲主機進行分類;
3)查詢時按照用戶邊查詢邊匯總,并輸出本主機的查詢結(jié)果到HDFS;
4)最終將每臺主機的查詢結(jié)果下載后匯總,然后將最終結(jié)果輸出到HDFS。
位圖索引技術(shù)的效率主要取決于查詢條件能否落在位圖索引上或者落在位圖索引上的多少。查詢條件落在位圖索引上越多,HBASE位圖索引技術(shù)效率越高;查詢條件落在位圖索引上越少,HBASE位圖索引技術(shù)效率越低。因此合理設(shè)計位圖索引的業(yè)務(wù)類和合理設(shè)計每張HBASE表的檢索業(yè)務(wù)尤為關(guān)鍵。
下面是普通HBASE查詢與基于位圖索引的HBASE查詢速度對比(基于同一個查詢過濾條件)。
如表1所示,表格行數(shù)與普通HBASE查詢耗時呈現(xiàn)線性相關(guān),而基于位圖索引的HBASE查詢不太受表格行數(shù)的影響。前者是由于普通HBASE查詢需要掃描全表,耗時自然與表格行數(shù)有關(guān)。后者是因為位圖索引大小與表格行數(shù)無關(guān),僅與表格主屬性相關(guān),所以索引查找耗時不會隨表格行數(shù)的增加而變化;由于索引查找得出的是ROWKEY范圍,當表格行數(shù)增加時,ROWKEY范圍并不會產(chǎn)生變化,只是每個ROWKEY范圍的行數(shù)可能變多,所以HBASE掃描耗時也不會增加太多。
表1 普通HBASE查詢與基于位圖索引的HBASE查詢測試結(jié)果
本文針對HBASE全表查詢速度慢的缺點,設(shè)計了一種基于位圖索引的查詢方案。該方案通過對常用檢索業(yè)務(wù)添加位圖索引,有效縮小了HBASE掃描范圍,即由全表掃描縮小為ROWKEY范圍掃描,大大降低了查詢的時間成本。同時,位圖索引所額外占用的資源量極少,以1億用戶2000個屬性進行估算,其占用的內(nèi)存資源僅為:100,000,000*2000/8/1024/1024/1024=23G B。這與傳統(tǒng)的二級索引技術(shù)相比其資源的耗用基本可以忽略不記。由于采用了2次查詢的方式,在使用過程中如果HBASE發(fā)送小范圍數(shù)據(jù)變更無需修正本發(fā)明所設(shè)計的二級索引內(nèi)容,也可保證數(shù)據(jù)查詢的準確性,進一步減少了方案中數(shù)據(jù)的使用、維護成本。因此基于位圖索引技術(shù)創(chuàng)建HBASE二級索引的實踐在資源的使用和后期的維護無疑是極具性價比的、高效的HBASE查詢的方案。