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