本發(fā)明涉及在大數(shù)據(jù)應(yīng)用開發(fā)過程中一種大數(shù)據(jù)系統(tǒng)自動選型與參數(shù)配置的方法,屬于計算機數(shù)據(jù)庫管理技術(shù)領(lǐng)域。
背景技術(shù):
隨著傳感器技術(shù)的發(fā)展和互聯(lián)網(wǎng)的普及,數(shù)據(jù)的采集和信息的傳播速度達到了空前的水平。對于數(shù)據(jù)的極值、均值等聚合信息變得十分重要,如何快速準確獲取這些聚合信息是本文的研究重點。
要滿足這類查詢,數(shù)據(jù)庫就必須支持在任意時間范圍內(nèi),在海量數(shù)據(jù)上進行快速的聚合操作。
傳統(tǒng)關(guān)系型數(shù)據(jù)庫主要采用概要表或物化視圖的方式達到加速聚合查詢的目的。其中,物化視圖是對涉及表連接的查詢命令進行預(yù)處理,并將結(jié)果保存在視圖表中,用戶發(fā)生查詢時,數(shù)據(jù)庫直接從視圖表中查詢并返回結(jié)果。概要表則是在寫入數(shù)據(jù)的同時,計算并保存相應(yīng)的概要信息,從而發(fā)生查詢時,直接從概要表中查詢并返回結(jié)果。
這兩種方式的本質(zhì)都是預(yù)先計算并保存常用的聚合信息,縮小查詢范圍,提高實際查詢速度。其弊端是增加了數(shù)據(jù)庫的膨脹率;隨著數(shù)據(jù)的增多,會出現(xiàn)性能退化的問題。
而在NoSQL數(shù)據(jù)庫中,一些數(shù)據(jù)庫采用了MapReduce的方式來處理這些聚合操作:每次聚合查詢實時從數(shù)據(jù)庫中檢出涉及的表數(shù)據(jù),提交到Map程序中進行處理。在Map階段,程序過濾出滿足條件的數(shù)據(jù)并提交給Reduce程序。Reduce程序匯總并計算出查詢結(jié)果。另一些數(shù)據(jù)庫如MongoDB,則提出了聚合管道(Aggregation Pipeline)的概念。它是結(jié)合MapReduce的思想和Linux系統(tǒng) 管道的思想的產(chǎn)物。其原理是,聚合操作直接作用在數(shù)據(jù)文件上,通過類系統(tǒng)的原生操作,直接過濾聚合文件中的數(shù)據(jù)。
MapReduce和聚合管道的方式都是實時計算的代表。雖然沒有增加數(shù)據(jù)庫的膨脹率,但查詢過程中產(chǎn)生了大量的磁盤和計算開銷,低效耗時,無法滿足即席查詢的需求。
而Plamen Nikolov等人則將物化視圖的思想應(yīng)用到NoSQL中:預(yù)先計算計數(shù)、求和等常見統(tǒng)計信息,并保存在視圖表中,后續(xù)持續(xù)增量更新,以達到加快查詢響應(yīng)的目的。
這種方式相比于在NoSQL數(shù)據(jù)庫上進行MapReduce計算的速度提升非常明顯,但也有其弊端。物化視圖本身的形成機制決定了其不支持任意范圍的查詢操作。另外,隨著數(shù)據(jù)量的上升,查詢操作的磁盤開銷也會增大。
技術(shù)實現(xiàn)要素:
基于上述問題,本文提出了一種支持NoSQL數(shù)據(jù)庫聚合操作的索引機制。其基本思想是將概要表和線段樹(Segment Tree)結(jié)合起來,在概要表上建立由多棵線段樹構(gòu)成的線段森林模型,從而避免概要表的全表掃描操作。同時,通過自底向上的方式動態(tài)構(gòu)建線段森林,回避了傳統(tǒng)線段樹不支持增長的缺點。此外,查詢算法通過計算直接定位索引數(shù)據(jù),避免了對線段森林的遞歸遍歷操作,減少了磁盤IO次數(shù)。本文在Cassandra數(shù)據(jù)庫上實現(xiàn)了上述的索引引擎,并設(shè)計2組對比實驗:基于數(shù)據(jù)的直接查詢和基于概要表的直接查詢。實驗結(jié)果表明,這種概要表+線段森林的計算查詢方式,有效減少了磁盤IO的次數(shù),顯著提升了查詢性能。
一種支持時序數(shù)據(jù)聚合函數(shù)的索引方法,其特征在于,包括兩個步驟:
步驟一、定義時序數(shù)據(jù)的數(shù)據(jù)模型和查詢需求
定義1:數(shù)據(jù)項:一個數(shù)據(jù)項D(data point)是一個三元組(s,t,v),其中s是傳感器ID,t是時間戳,其中,s和t構(gòu)成了全局唯一的標識,v是傳感器的值,同一個傳感器的連續(xù)時間的數(shù)據(jù)項構(gòu)成了時序數(shù)據(jù),在此基礎(chǔ)上,定義本文要解決的查詢問題:在時序數(shù)據(jù)上,查詢時間窗口t1~t2(t1和t2為任意時刻)內(nèi)的時序數(shù)據(jù)的最值、方差統(tǒng)計信息;
定義2:概要信息:在時序數(shù)據(jù)中,k個在時間上連續(xù)的數(shù)據(jù)項的統(tǒng)計信息及其時間窗口構(gòu)成1個概要信息(data Digest);
定義3:葉子節(jié)點:由數(shù)據(jù)項直接產(chǎn)生的概要信息加上特定的標記信息構(gòu)成了葉子結(jié)點(leaf node);
定義4:中間節(jié)點:由2個葉子結(jié)點或2個中間結(jié)點匯總加上特定的標記信息構(gòu)成了中間結(jié)點(parent node);為了在避免樹的遞歸操作,實現(xiàn)概要森林的快速檢索,在葉子結(jié)點和中間結(jié)點上添加了必要的標記信息:序號和編號;
定義5:序號:初始建立索引時,依據(jù)產(chǎn)生順序,每個葉子結(jié)點對應(yīng)1個序號,序號由1開始遞增,中間結(jié)點沒有序號(serial);
定義6:編號:依據(jù)線段森林后序遍歷的順序,每個結(jié)點對應(yīng)1個編號,編號(code)由1開始遞增;
定義7:概要森林:概要森林(Synopsis Forest)是由結(jié)點產(chǎn)生的概要樹構(gòu)成的森林。
步驟二、概要森林的構(gòu)建與查詢
(1)概要森林構(gòu)建
概要森林維護一個棧結(jié)構(gòu)rootStack,用來提高合并效率;同時維護一個queue,用以暫存待刷入磁盤的節(jié)點信息,
A.當?shù)趇個葉子節(jié)點到來時:
A)若i為奇數(shù):
a)則直接添加該葉子結(jié)點,該葉子結(jié)點自成一棵樹,此時,該葉子結(jié)點對應(yīng)的序號為i,編號為2i-ones(i),其中,ones(i)函數(shù)為i的二進制表示中1的個數(shù);
b)將該葉子節(jié)點添加入rootStack和queue;
B)若i為偶數(shù):
a)在添加該葉子結(jié)點的同時,生成由該葉子結(jié)點觸發(fā)生成的新樹,此時,該葉子結(jié)點對應(yīng)的序號為i,編號為(i-1)葉子結(jié)點的編號加1即2(i-1)-ones(i-1)+1;
b)將該葉子節(jié)點添加入queue;
c)由于該葉子節(jié)點產(chǎn)生的新樹的根結(jié)點編號為2i-ones(i),其余新生成的中間結(jié)點的編號依次為2(i-1)-ones(i-1)+2到2i-ones(i)-1;
d)將該葉子節(jié)點放入rootStack;
e)彈出rootStack的前兩個節(jié)點,這兩個節(jié)點具有相同的高度且均為根節(jié)點,合并兩者形成新的樹,該樹的根節(jié)點編號從2(i-1)-ones(i-1)+2不斷增長到2i-ones(i);
f)將1-a-ii-5生成的根節(jié)點放入queue;
g)將1-a-ii-5生成的根節(jié)點放入rootStack,重復(fù)1-a-ii-5,直到新生成的根節(jié)點編號達到2i-ones(i);
B.將queue中所暫存的節(jié)點刷入磁盤。
(2)概要森林查詢
1)首先定義查詢需求:查詢時間窗口ta~tb對應(yīng)數(shù)據(jù)項的概要信息。
2)查詢具體步驟如下:
A.標準化時間窗口,假設(shè)tis<ta<tie、tjs<tb<tje,則可將查詢的時間窗口劃分為3個時間窗口:ta<tie,t(i+1)s~t(j-1)e和tjs<tb;
B.對于時間窗口ta<tie和tjs<tb,需要從數(shù)據(jù)庫中直接讀取ta到tie和tjs到tb的數(shù)據(jù)項,并從數(shù)據(jù)項中直接計算出這段時間窗口的概要信息;
C.對于時間窗口t(i+1)s~t(j-1)e,從線段森林中找出最少數(shù)量的線段,使得這些線段稱為時間窗口t(i+1)s~t(j-1)e的劃分。假設(shè)一共需要s個線段,依次從數(shù)據(jù)庫中讀取這s個線段對應(yīng)的概要結(jié)點,得到s個概要信息;本步具體實施過程如下:
a)根據(jù)起始時間t(i+1)s和t(j-1)e從數(shù)據(jù)庫中讀取出2個相應(yīng)的概要包,從概要包分別得到對應(yīng)的序號i和j;
b)獲取下界序號:如果i是偶數(shù),把t(i+1)s對應(yīng)的概要包添加到待處理隊列,此時下界序號為(i+1)。否則,下界序號為i;
c)獲取上界序號:如果j是奇數(shù),把t(j-1)e對應(yīng)的概要包添加到待處理隊列,此時上界序號為(j-1),否則,上界序號為j;
d)由上界序號計算出對應(yīng)的編號,以及覆蓋該序號對應(yīng)結(jié)點的最上層結(jié)點的編號;
e)由編號和最上層結(jié)點的編號計算出最上層結(jié)點覆蓋的最左葉子結(jié)點的序號;
f)如果最左序號大于下界序號,則將最上層結(jié)點的編號加入待查詢隊列,并把上界序號設(shè)置為最左葉子結(jié)點的序號減1,轉(zhuǎn)到步驟d;
g)如果最左序號小于下界序號,則最上層結(jié)點的編號減1,轉(zhuǎn)到步驟e;
h)如果最左序號等于下界序號,則將最上層節(jié)點的編號加入待查詢隊列中,然后退出循環(huán);
i)最后根據(jù)帶查詢隊列查出相應(yīng)的概要包,并將這些概要包添加到待處理隊列。
由步驟B和C中的(s+2)個概要信息即可計算出時間窗口ta~tb的概要信息。
本發(fā)明提出了一種支持時序數(shù)據(jù)聚合操作的高效索引方法,其優(yōu)點是:
1.能夠支持簡單聚合操作的快速即席查詢。在查詢過程中,該索引機制能夠避免了大量的磁盤開銷,解決了物化視圖和概要表隨著數(shù)據(jù)量增長導(dǎo)致的性能下降的問題;
2.將概要表和線段樹(Segment Tree)結(jié)合起來,在概要表上建立由多棵線段樹構(gòu)成的線段森林模型,從而避免概要表的全表掃描操作;
3.通過自底向上的方式動態(tài)構(gòu)建線段森林,回避了傳統(tǒng)線段樹不支持增長的缺點。此外,查詢算法通過計算直接定位索引數(shù)據(jù),避免了對線段森林的遞歸遍歷操作,減少了磁盤IO次數(shù);
4.這種索引機制與底層數(shù)據(jù)庫無關(guān),通過自實現(xiàn)的基于JAVA的查詢引擎,可以輕松移植到任意數(shù)據(jù)庫平臺中。
附圖說明
下面結(jié)合附圖,通過非限定性的舉例對本發(fā)明的優(yōu)選實施方式作進一步說明,在附圖中:
圖1是一組數(shù)據(jù)項所對應(yīng)的概要信息示意圖。
圖2是本發(fā)明方法定義的概要森林與時間窗口。
圖3是本發(fā)明中涉及的添加序號為奇數(shù)(上)和偶數(shù)(下)的結(jié)點。
圖4是本發(fā)明中的添加葉子節(jié)點算法偽代碼。
圖5是本發(fā)明中的查詢過程算法偽代碼。
具體實施方式
下面結(jié)合附圖對本發(fā)明作進一步的詳細說明。
1.一種支持時序數(shù)據(jù)聚合函數(shù)的索引方法,其特征在于,包括兩個步驟:
步驟一、定義時序數(shù)據(jù)的數(shù)據(jù)模型和查詢需求
定義1:數(shù)據(jù)項:一個數(shù)據(jù)項D(data point)是一個三元組(s,t,v),其中s是傳感器ID,t是時間戳,其中,s和t構(gòu)成了全局唯一的標識,v是傳感器的值,同一個傳感器的連續(xù)時間的數(shù)據(jù)項構(gòu)成了時序數(shù)據(jù),在此基礎(chǔ)上,定義本文要解決的查詢問題:在時序數(shù)據(jù)上,查詢時間窗口t1~t2(t1和t2為任意時刻)內(nèi)的時序數(shù)據(jù)的最值、方差統(tǒng)計信息;
定義2:概要信息:在時序數(shù)據(jù)中,k個在時間上連續(xù)的數(shù)據(jù)項的統(tǒng)計信息及其時間窗口構(gòu)成1個概要信息(data Digest);
定義3:葉子節(jié)點:由數(shù)據(jù)項直接產(chǎn)生的概要信息加上特定的標記信息構(gòu)成了葉子結(jié)點(leaf node);
定義4:中間節(jié)點:由2個葉子結(jié)點或2個中間結(jié)點匯總加上特定的標記信息構(gòu)成了中間結(jié)點(parent node);為了在避免樹的遞歸操作,實現(xiàn)概要森林的快速檢索,在葉子結(jié)點和中間結(jié)點上添加了必要的標記信息:序號和編號;
定義5:序號:初始建立索引時,依據(jù)產(chǎn)生順序,每個葉子結(jié)點對應(yīng)1個序號,序號由1開始遞增,中間結(jié)點沒有序號(serial);
定義6:編號:依據(jù)線段森林后序遍歷的順序,每個結(jié)點對應(yīng)1個編號,編號(code)由1開始遞增;
定義7:概要森林:概要森林(Synopsis Forest)是由結(jié)點產(chǎn)生的概要樹構(gòu)成的森林。
步驟二、概要森林的構(gòu)建與查詢
(1)概要森林構(gòu)建
概要森林維護一個棧結(jié)構(gòu)rootStack,用來提高合并效率;同時維護一個queue,用以暫存待刷入磁盤的節(jié)點信息,
A.當?shù)趇個葉子節(jié)點到來時:
A)若i為奇數(shù):
a)則直接添加該葉子結(jié)點,該葉子結(jié)點自成一棵樹,此時,該葉子結(jié)點對應(yīng)的序號為i,編號為2i-ones(i),其中,ones(i)函數(shù)為i的二進制表示中1的個數(shù);
b)將該葉子節(jié)點添加入rootStack和queue;
B)若i為偶數(shù):
a)在添加該葉子結(jié)點的同時,生成由該葉子結(jié)點觸發(fā)生成的新樹,此時,該葉子結(jié)點對應(yīng)的序號為i,編號為(i-1)葉子結(jié)點的編號加1即2(i-1)-ones(i-1)+1;
b)將該葉子節(jié)點添加入queue;
c)由于該葉子節(jié)點產(chǎn)生的新樹的根結(jié)點編號為2i-ones(i),其余新生成的中間結(jié)點的編號依次為2(i-1)-ones(i-1)+2到2i-ones(i)-1;
d)將該葉子節(jié)點放入rootStack;
e)彈出rootStack的前兩個節(jié)點,這兩個節(jié)點具有相同的高度且均為根節(jié)點,合并兩者形成新的樹,該樹的根節(jié)點編號從2(i-1)-ones(i-1)+2不斷增長到2i-ones(i);
f)將1-a-ii-5生成的根節(jié)點放入queue;
g)將1-a-ii-5生成的根節(jié)點放入rootStack,重復(fù)1-a-ii-5,直到新生成的根節(jié)點編號達到2i-ones(i);
B.將queue中所暫存的節(jié)點刷入磁盤。
(3)概要森林查詢
1)首先定義查詢需求:查詢時間窗口ta~tb對應(yīng)數(shù)據(jù)項的概要信息,
2)查詢具體步驟如下:
A.標準化時間窗口,假設(shè)tis<ta<tie、tjs<tb<tje,則可將查詢的時間窗口劃分為3個時間窗口:ta<tie,t(i+1)s~t(j-1)e和tjs<tb;
B.對于時間窗口ta<tie和tjs<tb,需要從數(shù)據(jù)庫中直接讀取ta到tie和tjs到tb的數(shù)據(jù)項,并從數(shù)據(jù)項中直接計算出這段時間窗口的概要信息;
C.對于時間窗口t(i+1)s~t(j-1)e,從線段森林中找出最少數(shù)量的線段,使得這些線段稱為時間窗口t(i+1)s~t(j-1)e的劃分。假設(shè)一共需要s個線段,依次從數(shù)據(jù)庫中讀取這s個線段對應(yīng)的概要結(jié)點,得到s個概要信息;本步具體實施過程如下:
a)根據(jù)起始時間t(i+1)s和t(j-1)e從數(shù)據(jù)庫中讀取出2個相應(yīng)的概要包,從概要包分別得到對應(yīng)的序號i和j;
b)獲取下界序號:如果i是偶數(shù),把t(i+1)s對應(yīng)的概要包添加到待處理隊列,此時下界序號為(i+1)。否則,下界序號為i;
c)獲取上界序號:如果j是奇數(shù),把t(j-1)e對應(yīng)的概要包添加到待處理隊列,此時上界序號為(j-1),否則,上界序號為j;
d)由上界序號計算出對應(yīng)的編號,以及覆蓋該序號對應(yīng)結(jié)點的最上層結(jié)點的編號;
e)由編號和最上層結(jié)點的編號計算出最上層結(jié)點覆蓋的最左葉子結(jié)點的序號;
f)如果最左序號大于下界序號,則將最上層結(jié)點的編號加入待查詢隊列,并把上界序號設(shè)置為最左葉子結(jié)點的序號減1,轉(zhuǎn)到步驟d;
g)如果最左序號小于下界序號,則最上層結(jié)點的編號減1,轉(zhuǎn)到步驟e;
h)如果最左序號等于下界序號,則將最上層節(jié)點的編號加入待查詢隊列中,然后退出循環(huán);
i)最后根據(jù)帶查詢隊列查出相應(yīng)的概要包,并將這些概要包添加到待處理隊列。
由步驟B和C中的(s+2)個概要信息即可計算出時間窗口ta~tb的概要信息。