本發(fā)明涉及存儲(chǔ)技術(shù)領(lǐng)域,具體涉及一種基于hbase散列概要森林對(duì)時(shí)序數(shù)據(jù)進(jìn)行索引的方法。
背景技術(shù):
時(shí)序數(shù)據(jù)為以時(shí)間序列索引的連續(xù)數(shù)據(jù),隨著計(jì)算機(jī)應(yīng)用的普及,時(shí)序數(shù)據(jù)在各個(gè)領(lǐng)域也得到了廣泛的應(yīng)用。例如:隨著金融領(lǐng)域與互聯(lián)網(wǎng)的結(jié)合越來(lái)越緊密,金融領(lǐng)域大量的量化回撤操作對(duì)時(shí)序數(shù)據(jù)的聚合操作性能需求越來(lái)越大。例如:對(duì)期貨中一個(gè)季度時(shí)間范圍內(nèi)的某種商品合約的市價(jià)、盤(pán)口價(jià)格或成交量等進(jìn)行統(tǒng)計(jì),進(jìn)行求和或計(jì)算最大值等聚合操作。這樣的應(yīng)用場(chǎng)景在金融量化中出現(xiàn)頻繁,并且由于數(shù)據(jù)量巨大,如何快速準(zhǔn)確地計(jì)算t1~t2時(shí)間內(nèi)的金融時(shí)序數(shù)據(jù)的聚合操作結(jié)果變得十分重要。
以對(duì)au金屬期貨交易數(shù)據(jù)中一定時(shí)間范圍內(nèi)市價(jià)的求和操作為例:
selectsum(lastprice)from‘a(chǎn)u’wheretime>t1andtime<t2
在這樣的應(yīng)用場(chǎng)景下,必須支持在海量的時(shí)序數(shù)據(jù)中快速取得聚合操作結(jié)果。
傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)主要采用物化視圖或概要表的方式達(dá)到加速聚合查詢(xún)的目的。物化視圖是對(duì)涉及表連接的查詢(xún)命令進(jìn)行預(yù)處理,并將結(jié)果保存在視圖表中,查詢(xún)時(shí)直接取出預(yù)處理好的結(jié)果。概要表則是在寫(xiě)入數(shù)據(jù)的同時(shí),計(jì)算并保存相應(yīng)的概要信息,從而發(fā)生查詢(xún)時(shí),直接從概要表中查詢(xún)并返回結(jié)果。此類(lèi)方法提高了查詢(xún)效率,但是缺點(diǎn)是增加了數(shù)據(jù)庫(kù)的膨脹率。在nosql數(shù)據(jù)庫(kù)中,一些數(shù)據(jù)庫(kù)采用mapreduce和聚合管道的方式來(lái)處理這些聚合操作,其都是實(shí)時(shí)計(jì)算的代表,雖然沒(méi)有增加數(shù)據(jù)庫(kù)的膨脹率,但查詢(xún)過(guò)程中產(chǎn)生了大量的磁盤(pán)和計(jì)算開(kāi)銷(xiāo),低效耗時(shí),無(wú)法滿足即席查詢(xún)的需求。一些nosql數(shù)據(jù)庫(kù)將樹(shù)型索引結(jié)構(gòu)融合,提高了查詢(xún)效率,減少了磁盤(pán)訪問(wèn)次數(shù)。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述,本發(fā)明提出了一種基于hbase散列概要森林對(duì)時(shí)序數(shù)據(jù)進(jìn)行索引的方法,通過(guò)建立樹(shù)形索引加快了時(shí)序數(shù)據(jù)的查詢(xún)時(shí)間,并通過(guò)散列碼避免了時(shí)序數(shù)據(jù)在分布式數(shù)據(jù)庫(kù)中順序存儲(chǔ)產(chǎn)生的空間分配不均的問(wèn)題。
一種基于hbase散列概要森林對(duì)時(shí)序數(shù)據(jù)進(jìn)行索引的方法,包括以下步驟:
(1)根據(jù)時(shí)間粒度建立每棵時(shí)間單元樹(shù);
(2)求取每棵時(shí)間單元樹(shù)的散列碼,并將帶有散列碼的時(shí)間單元樹(shù)組成基于hbase的散列概要森林;
(3)將采集的時(shí)序數(shù)據(jù)根據(jù)散列碼插入到散列概要森林中;
(4)根據(jù)時(shí)間范圍查詢(xún)讀取存儲(chǔ)的時(shí)序數(shù)據(jù)。
步驟(1)中,建立時(shí)間單元樹(shù)的過(guò)程為:首先,預(yù)先確定時(shí)間單元樹(shù)的時(shí)間粒度;然后以根節(jié)點(diǎn)開(kāi)始進(jìn)行遞歸,每次建立一個(gè)新的節(jié)點(diǎn),接下來(lái),遞歸建立此節(jié)點(diǎn)的左右孩子節(jié)點(diǎn),當(dāng)創(chuàng)建的節(jié)點(diǎn)超出預(yù)先計(jì)算的范圍時(shí)停止遞歸,完成整棵樹(shù)的建立過(guò)程。
在步驟(1)中,每棵時(shí)間單元樹(shù)是一棵線段樹(shù),且包含一個(gè)固定時(shí)間粒度。通過(guò)控制每棵樹(shù)的樹(shù)高來(lái)控制時(shí)間粒度。線段樹(shù)節(jié)點(diǎn)存儲(chǔ)該節(jié)點(diǎn)范圍的概要信息,主要包括:lbound、rbound、lnode、rnode以及data;其中,lbound、rbound分別表示該節(jié)點(diǎn)包含時(shí)間范圍的起始時(shí)間點(diǎn)和終止時(shí)間點(diǎn);lnode、rnode分別表示該節(jié)點(diǎn)左孩子和右孩子節(jié)點(diǎn)包含時(shí)間點(diǎn)的中點(diǎn);data表示該節(jié)點(diǎn)存放的概要數(shù)據(jù)值,此時(shí)建立的時(shí)間單元樹(shù)的每個(gè)節(jié)點(diǎn)的data是空的。
每棵樹(shù)的根節(jié)點(diǎn)表示這棵樹(shù)攜帶的t時(shí)間長(zhǎng)度內(nèi)時(shí)序數(shù)據(jù)的聚合結(jié)果,第二層節(jié)點(diǎn)攜帶t/2時(shí)間長(zhǎng)度內(nèi)時(shí)序數(shù)據(jù)的聚合結(jié)果,類(lèi)推每層節(jié)點(diǎn)攜帶上一層節(jié)點(diǎn)一半時(shí)間長(zhǎng)度的索引數(shù)據(jù)。通過(guò)控制樹(shù)高從而實(shí)現(xiàn)包含固定時(shí)間粒度的時(shí)間單元樹(shù)可以方便用同一個(gè)散列碼聚合每棵樹(shù)的節(jié)點(diǎn),實(shí)現(xiàn)熱點(diǎn)的負(fù)載均衡。
一棵時(shí)間單元樹(shù)表示一個(gè)單元時(shí)間粒度范圍的聚合結(jié)果,每棵樹(shù)的葉子節(jié)點(diǎn)表示最細(xì)粒度范圍的聚合概要信息。粒度可根據(jù)實(shí)際需求調(diào)整。
時(shí)間單元樹(shù)覆蓋時(shí)間(treebound)計(jì)算公式:
treebound=(2^(treemaxlevel-1))*leafbound
其中,treemaxlevel為最大樹(shù)高,leafbound為葉子節(jié)點(diǎn)表示的時(shí)間范圍。例如:一棵時(shí)間單元樹(shù)時(shí)間范圍定為一天,樹(shù)高定為9層,葉子節(jié)點(diǎn)表示6分鐘的概要信息。所以一棵樹(shù)共管轄1536分鐘的聚合數(shù)據(jù),實(shí)現(xiàn)一棵時(shí)間單元樹(shù)覆蓋一天的時(shí)間范圍。
在步驟(2)中,求取每棵時(shí)間單元樹(shù)的散列碼的方式有很多,作為優(yōu)選,選取通過(guò)對(duì)每棵樹(shù)的信息進(jìn)行md5轉(zhuǎn)碼處理生成此時(shí)間單元樹(shù)的對(duì)應(yīng)散列碼(hash),并將其寫(xiě)入treehash表中;計(jì)算散列碼的具體方式為:
hash=md5(treeinfo+treelowbound)
treeinfo為數(shù)據(jù)標(biāo)識(shí)簡(jiǎn)要信息,例如:此數(shù)據(jù)代表au金屬元素期貨數(shù)據(jù),則標(biāo)注為au,treelowbound為時(shí)間單元樹(shù)的起始時(shí)間點(diǎn)。
多棵時(shí)間單元樹(shù)組成散列概要森林,整個(gè)散列概要森林所索引的數(shù)據(jù)的時(shí)間范圍為組成他的時(shí)間單元樹(shù)所表示的時(shí)間范圍之和。
基于hbase的散列概要森林由tree-hash和tree-node兩個(gè)hbase表組成,其中,tree-hash表用于查找時(shí)間單元樹(shù)的散列碼,tree-node表存儲(chǔ)所有的時(shí)間單元樹(shù)的樹(shù)節(jié)點(diǎn),且tree-hash表與tree-node表是單獨(dú)存儲(chǔ),即將每棵時(shí)間單元樹(shù)的散列碼與每棵時(shí)間單元樹(shù)載有的時(shí)序數(shù)據(jù)分開(kāi)單獨(dú)存儲(chǔ),并且將擁有相同散列碼的時(shí)間單元樹(shù)載有的時(shí)序數(shù)據(jù)集中存儲(chǔ)。
在步驟(3)中,所述的時(shí)序數(shù)據(jù)可以是金融時(shí)序數(shù)據(jù)、期貨交易數(shù)據(jù)等任一時(shí)序數(shù)據(jù)。
在步驟(3)中,將時(shí)序數(shù)據(jù)插入到散列概要森林的具體過(guò)程為:
(3-1)通過(guò)時(shí)序數(shù)據(jù)的所屬于的時(shí)間在tree-hash表中找到此時(shí)序數(shù)據(jù)所在的時(shí)間單元樹(shù)的treehash值;
(3-2)找到該treehash值所對(duì)應(yīng)的tree-node表,將時(shí)序數(shù)據(jù)遞歸插入到此tree-node表中,具體過(guò)程為:
首先,根據(jù)treehash值找到所處時(shí)間單元樹(shù)的根節(jié)點(diǎn)開(kāi)始遞歸,然后進(jìn)行時(shí)序數(shù)據(jù)的時(shí)間點(diǎn)與當(dāng)前查詢(xún)節(jié)點(diǎn)的時(shí)間對(duì)比,當(dāng)時(shí)序數(shù)據(jù)的時(shí)間點(diǎn)小于該節(jié)點(diǎn)的時(shí)間時(shí),向該節(jié)點(diǎn)的左孩子遞歸插入時(shí)序數(shù)據(jù),當(dāng)時(shí)序數(shù)據(jù)的時(shí)間點(diǎn)大于該節(jié)點(diǎn)時(shí)間時(shí),則該節(jié)點(diǎn)的右孩子遞歸插入時(shí)序數(shù)據(jù);直到插入到時(shí)間單元樹(shù)的葉子節(jié)點(diǎn)為止。
在步驟(4)中,在數(shù)據(jù)查詢(xún)時(shí),散列概要森林由于同一個(gè)時(shí)間單元樹(shù)中的數(shù)據(jù)的rowkey擁有同樣的散列碼,所以hbase范圍查詢(xún)可以快速找出整棵時(shí)間單元樹(shù)并存入內(nèi)存中,這大大節(jié)省對(duì)樹(shù)進(jìn)行遞歸后的磁盤(pán)io操作。
進(jìn)行數(shù)據(jù)查詢(xún)的過(guò)程為:
(a)判斷查詢(xún)時(shí)間范圍(t1,t2)是否屬于同一個(gè)時(shí)間單元樹(shù)范圍,若是,執(zhí)行步驟(b),若否,執(zhí)行步驟(c);
(b)查詢(xún)操作為query(t1,t2);
(c)查詢(xún)操作為query(t1,endunittime(t1))、query(midunittime)以及query(startunittime(t2),t2);
其中,startunittime(t1)為時(shí)間點(diǎn)t1所處的時(shí)間單元的起始時(shí)間點(diǎn);
endunittime(t2)為時(shí)間點(diǎn)t2所處的時(shí)間單元的結(jié)束時(shí)間點(diǎn);
midunittime為t1與t2所處的時(shí)間單元樹(shù)的時(shí)間范圍之間的若干單元樹(shù)的時(shí)間范圍;
query(t1,t2)表示為在同一棵時(shí)間單元樹(shù)中查詢(xún)時(shí)間范圍(t1,t2)的執(zhí)行查詢(xún)操作;
query(t1,endunittime(t1))表示在查詢(xún)范圍中的第一棵單元樹(shù)中執(zhí)行查詢(xún)操作;
query(midunittime)表示在查詢(xún)范圍中的第二棵到第倒數(shù)第二棵單元樹(shù)中執(zhí)行查詢(xún)操作;
query(startunittime(t2),t2)表示在查詢(xún)范圍中的最后一棵單元樹(shù)中執(zhí)行查詢(xún)操作。
query(t1,t2)的具體過(guò)程為:
(a)通過(guò)查找項(xiàng)的時(shí)間推算出其所屬時(shí)間單元樹(shù)的散列碼并定位到此時(shí)間單元樹(shù),并將此時(shí)間單元樹(shù)的根節(jié)點(diǎn)作為當(dāng)前根節(jié)點(diǎn);
(b)從當(dāng)前根節(jié)點(diǎn)開(kāi)始遞歸查詢(xún),查詢(xún)?nèi)蝿?wù)從(t1,t2)開(kāi)始;
(c)遞歸查詢(xún)到當(dāng)前節(jié)點(diǎn)時(shí),解析出該節(jié)點(diǎn)包含的時(shí)間范圍的起始時(shí)間點(diǎn)lbound、中間時(shí)間點(diǎn)midtime以及終止時(shí)間點(diǎn)rbound;
(d)判斷t1與t2是否滿足t1=lbound且t2=rbound,若是,記錄該節(jié)點(diǎn)結(jié)果并退出遞歸,若否,執(zhí)行步驟(e);
(e)判斷t1與t2是否滿足t1≤midtime且t2≤midtime,若是,將該節(jié)點(diǎn)的左孩子節(jié)點(diǎn)作為當(dāng)前根節(jié)點(diǎn),跳轉(zhuǎn)執(zhí)行步驟(b)~步驟(d),若否,執(zhí)行步驟(f);
(f)判斷t1與t2是否滿足t1≥midtime且t2≥midtime,若是,將該節(jié)點(diǎn)的右孩子節(jié)點(diǎn)作為當(dāng)前根節(jié)點(diǎn),執(zhí)行步驟(b)~步驟(d);若否,執(zhí)行步驟(g);
(g)判斷時(shí)間t2是否滿足lbound<t2<midtime,若是,將左孩子作為當(dāng)前節(jié)點(diǎn),將midtime作為t2,執(zhí)行步驟(b)~步驟(d);將右孩子節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),將midtime作為t1,執(zhí)行步驟(b)~步驟(d)。
本發(fā)明通過(guò)結(jié)合概要森林樹(shù)形索引方案,提高時(shí)序數(shù)據(jù)聚合操作的查詢(xún)速度,同時(shí)通過(guò)生成散列碼為單元樹(shù)提供散列索引,解決hbase分布式存儲(chǔ)時(shí)序數(shù)據(jù)產(chǎn)生熱點(diǎn)問(wèn)題。
附圖說(shuō)明
圖1為本發(fā)明基于hbase散列概要森林對(duì)時(shí)序數(shù)據(jù)進(jìn)行索引的方法的流程圖;
圖2為建立的時(shí)間單元樹(shù)的結(jié)構(gòu)示意圖;
圖3為本發(fā)明實(shí)施例1中寫(xiě)入數(shù)據(jù)吞吐量對(duì)比圖;
圖4為本發(fā)明實(shí)施例2中大跨度時(shí)間范圍聚合查詢(xún)耗時(shí)對(duì)比圖;
圖5為本發(fā)明實(shí)施例3中散列概要深林方法與非散列概要深林方法查詢(xún)耗時(shí)對(duì)比圖。
具體實(shí)施方式
為了更為具體地描述本發(fā)明,下面結(jié)合附圖及具體實(shí)施方式對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)說(shuō)明。
如圖1所示,基于hbase散列概要森林對(duì)時(shí)序數(shù)據(jù)進(jìn)行索引的方法的具體步驟為:
步驟1,建立每棵時(shí)間單元樹(shù):首先,預(yù)先確定時(shí)間單元樹(shù)的時(shí)間范圍;然后以根節(jié)點(diǎn)開(kāi)始進(jìn)行遞歸,每次建立一個(gè)新的節(jié)點(diǎn),接下來(lái),遞歸建立此節(jié)點(diǎn)的左右孩子節(jié)點(diǎn),當(dāng)創(chuàng)建的節(jié)點(diǎn)超出預(yù)先計(jì)算的范圍時(shí)停止遞歸,完成整棵樹(shù)的建立過(guò)程,并將每個(gè)節(jié)點(diǎn)寫(xiě)入treenode表中,建立的時(shí)間單元樹(shù)如圖2所示;
此步驟中,建立的每棵時(shí)間單元樹(shù)是一棵線段樹(shù),且包含一個(gè)固定時(shí)間粒度。通過(guò)控制每棵樹(shù)的樹(shù)高來(lái)控制時(shí)間粒度。線段樹(shù)節(jié)點(diǎn)存儲(chǔ)該節(jié)點(diǎn)范圍的概要信息,主要包括:lbound、rbound、lnode、rnode以及data;其中,lbound、rbound分別表示該節(jié)點(diǎn)包含時(shí)間范圍的起始時(shí)間點(diǎn)和終止時(shí)間點(diǎn);lnode、rnode分別表示該節(jié)點(diǎn)左孩子和右孩子節(jié)點(diǎn)包含時(shí)間點(diǎn)的中點(diǎn);data表示該節(jié)點(diǎn)存放的概要數(shù)據(jù)值,此時(shí)建立的時(shí)間單元樹(shù)的每個(gè)節(jié)點(diǎn)的data是空的。
每棵樹(shù)的根節(jié)點(diǎn)表示這棵樹(shù)攜帶的t時(shí)間長(zhǎng)度內(nèi)時(shí)序數(shù)據(jù)的聚合結(jié)果,第二層節(jié)點(diǎn)攜帶t/2時(shí)間長(zhǎng)度內(nèi)時(shí)序數(shù)據(jù)的聚合結(jié)果,類(lèi)推每層節(jié)點(diǎn)攜帶上一層節(jié)點(diǎn)一半時(shí)間長(zhǎng)度的索引數(shù)據(jù)。通過(guò)控制樹(shù)高從而實(shí)現(xiàn)包含固定時(shí)間粒度的時(shí)間單元樹(shù)可以方便用同一個(gè)散列碼聚合每棵樹(shù)的節(jié)點(diǎn),實(shí)現(xiàn)熱點(diǎn)的負(fù)載均衡。
一棵時(shí)間單元樹(shù)表示一個(gè)單元時(shí)間粒度范圍的聚合結(jié)果,每棵樹(shù)的葉子節(jié)點(diǎn)表示最細(xì)粒度范圍的聚合概要信息。粒度可根據(jù)實(shí)際需求調(diào)整。
時(shí)間單元樹(shù)覆蓋時(shí)間(treebound)計(jì)算公式:
treebound=(2^(treemaxlevel-1))*leafbound
其中,treemaxlevel為樹(shù)最大樹(shù)高,leafbound為葉子節(jié)點(diǎn)表示的時(shí)間范圍。
步驟2,求取每棵時(shí)間單元樹(shù)的散列碼,并將帶有散列碼的時(shí)間單元樹(shù)組成基于hbase的散列概要森林;
此步驟中,計(jì)算散列碼的具體方式為:
hash=md5(treeinfo+treelowbound)
treeinfo為數(shù)據(jù)標(biāo)識(shí)簡(jiǎn)要信息,例如此數(shù)據(jù)代表au金屬元素期貨數(shù)據(jù),則標(biāo)注為au;treelowbound為時(shí)間單元樹(shù)的起始時(shí)間點(diǎn),將求得hash值寫(xiě)入treehash表中;
步驟3,將采集的時(shí)序數(shù)據(jù)插入到散列概要森林中,插入過(guò)程為:
步驟3-1,通過(guò)時(shí)序數(shù)據(jù)的所屬于的時(shí)間在tree-hash表中找到此時(shí)序數(shù)據(jù)所在的時(shí)間單元樹(shù)的treehash值;
步驟3-2,找到該treehash值所對(duì)應(yīng)的tree-node表,將時(shí)序數(shù)據(jù)遞歸插入到此tree-node表中,具體過(guò)程為:
首先,根據(jù)treehash值找到所處時(shí)間單元樹(shù)的根節(jié)點(diǎn)開(kāi)始遞歸,然后進(jìn)行時(shí)序數(shù)據(jù)的時(shí)間點(diǎn)與當(dāng)前查詢(xún)節(jié)點(diǎn)的時(shí)間對(duì)比,當(dāng)時(shí)序數(shù)據(jù)的時(shí)間點(diǎn)小于該節(jié)點(diǎn)的時(shí)間時(shí),向該節(jié)點(diǎn)的左孩子遞歸插入時(shí)序數(shù)據(jù),當(dāng)時(shí)序數(shù)據(jù)的時(shí)間點(diǎn)大于該節(jié)點(diǎn)時(shí)間時(shí),則該節(jié)點(diǎn)的右孩子遞歸插入時(shí)序數(shù)據(jù);直到插入到時(shí)間單元樹(shù)的葉子節(jié)點(diǎn)為止。
步驟4,根據(jù)時(shí)間范圍查詢(xún)讀取存儲(chǔ)的時(shí)序數(shù)據(jù),查詢(xún)的過(guò)程為:
步驟4-1,判斷查詢(xún)時(shí)間范圍(t1,t2)是否屬于同一個(gè)時(shí)間單元樹(shù)范圍,若是,執(zhí)行步驟4-2,若否,執(zhí)行步驟4-3;
步驟4-2,查詢(xún)操作為query(t1,t2);
步驟4-3,查詢(xún)操作為query(t1,endunittime(t1))、query(midunittime)以及query(startunittime(t2),t2)。
實(shí)施例1
利用本發(fā)明方法、opentsdb開(kāi)源時(shí)序數(shù)據(jù)庫(kù)方法以及原始hbase方法對(duì)相同的時(shí)序數(shù)據(jù)進(jìn)行數(shù)據(jù)寫(xiě)入,并記錄每種方法的寫(xiě)入吞吐量,如圖3所示,從圖3可以得到本發(fā)明方法由于有索引(散列碼)和建樹(shù)過(guò)程,所以數(shù)據(jù)寫(xiě)入速度比原始hbase方法直接存入原始數(shù)據(jù)慢,但比opentsdb開(kāi)源時(shí)序數(shù)據(jù)庫(kù)方法寫(xiě)入速度快。
表1顯示的是本發(fā)明方法進(jìn)行數(shù)據(jù)寫(xiě)入時(shí),hbase中的region的分裂情況。
從表1可以看出散列概要森林在觸發(fā)hbase的region分裂后按散列值分裂為多個(gè)region。擁有相同散列值的同一棵時(shí)間單元樹(shù)會(huì)分在同一個(gè)region中。散列值隨機(jī)生成,新建的樹(shù)均勻負(fù)載地散列在不同的region中,避免了熱點(diǎn)問(wèn)題。
實(shí)施例2
利用本發(fā)明方法、opentsdb開(kāi)源時(shí)序數(shù)據(jù)庫(kù)方法以及原始hbase方法對(duì)數(shù)據(jù)進(jìn)行大跨度時(shí)間范圍的聚合查詢(xún)操作,圖4為三種方法在長(zhǎng)時(shí)間范圍聚合查詢(xún)耗時(shí)對(duì)比圖,從圖4可以得到在大跨度時(shí)間范圍的聚合查詢(xún)操作中,本發(fā)明方法表現(xiàn)較好。同時(shí)可以看出原始hbase方法在查詢(xún)200000條數(shù)據(jù)的聚合結(jié)果時(shí),耗時(shí)數(shù)十秒,無(wú)法滿足快速即席查詢(xún)需求。opentsdb開(kāi)源時(shí)序數(shù)據(jù)庫(kù)方法由于緩存以及索引機(jī)制速度大大提升。本發(fā)明方法比opentsdb查詢(xún)速度更快,且隨著查詢(xún)范圍增大,查詢(xún)耗時(shí)增幅較其他方案更緩慢。說(shuō)明利用hbase的rowkey設(shè)計(jì),使用范圍查詢(xún)將整棵樹(shù)查出放入內(nèi)存對(duì)查詢(xún)性能有優(yōu)化作用,節(jié)約了磁盤(pán)開(kāi)銷(xiāo)。
實(shí)施例3
利用本發(fā)明方法與非散列方法對(duì)數(shù)據(jù)進(jìn)行聚合查詢(xún)操作,圖5為散列概要森林方法以及非散列方法查詢(xún)耗時(shí)對(duì)比圖。從圖5可以得到非散列方案rowkey缺少散列字段,并且查詢(xún)搜索線段樹(shù)每次遞歸時(shí)對(duì)hbase進(jìn)行隨機(jī)查詢(xún)。同一棵線段樹(shù)可能分散在不同的region中,本發(fā)明方法的查詢(xún)耗時(shí)小于非散列方法,且隨著查詢(xún)范圍的增大優(yōu)勢(shì)越明顯。
以上所述的具體實(shí)施方式對(duì)本發(fā)明的技術(shù)方案和有益效果進(jìn)行了詳細(xì)說(shuō)明,應(yīng)理解的是以上所述僅為本發(fā)明的最優(yōu)選實(shí)施例,并不用于限制本發(fā)明,凡在本發(fā)明的原則范圍內(nèi)所做的任何修改、補(bǔ)充和等同替換等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。