分布式順序表片內(nèi)二級索引方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種分布式順序表片內(nèi)二級索引方法及系統(tǒng),其中系統(tǒng)包括,索引布局管理模塊,為每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件;一致性更新模塊,寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中;內(nèi)存存儲刷寫模塊,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再生成數(shù)據(jù)存儲文件;合并和分裂模塊,索引存儲文件隨著數(shù)據(jù)存儲文件一起合并和分裂,保證兩者的一致性;多維區(qū)間查詢模塊,對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,一次查詢可使用多列索引。
【專利說明】分布式順序表片內(nèi)二級索引方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及分布式順序表信息處理技術(shù),特別涉及一種分布式順序表片內(nèi)二級索引方法及系統(tǒng)。
【背景技術(shù)】
[0002]分布式順序表(Distributed Ordered Table簡稱DOT)是一種最適用于海量數(shù)據(jù)下多維區(qū)間查詢的數(shù)據(jù)庫系統(tǒng),與本專利相關(guān)的現(xiàn)有技術(shù)是一個(gè)名為“一種對分布式順序表進(jìn)行多維區(qū)間查詢的方法及其系統(tǒng)”的專利,專利號為201210517589.3,其實(shí)現(xiàn)方案包括,分別為所述分布式順序表的每個(gè)索引列創(chuàng)建一張對應(yīng)的二級索引表,各索引列對應(yīng)的二級索引表的主鍵為該列值、所述分布式順序表的主鍵值和該列值的長度三者的拼接值;當(dāng)接收到區(qū)間查詢請求時(shí),依據(jù)所述查詢請求的字段名稱,從各所述二級索引表中查找所述字段名稱對應(yīng)的二級索引表,依據(jù)所述查詢請求的字段值,從所述對應(yīng)的二級索引表中查找所述查詢請求字段值對應(yīng)的記錄位置,直接從所述分布式順序表中的該記錄位置讀取相應(yīng)的數(shù)據(jù)。該現(xiàn)有技術(shù)的缺點(diǎn)和不足包括如下幾個(gè)方面:
[0003](I)需要更改原來機(jī)制或增加新的機(jī)制來保證數(shù)據(jù)和索引的一致性。因?yàn)榉植际巾樞虮砣鄙倏绫?、跨行的事?wù)支持,所以必須要更改原有的預(yù)寫日志機(jī)制或者額外添加一致性保證機(jī)制來保證索引和數(shù)據(jù)的一致性。
[0004](2)數(shù)據(jù)寫入性能下降嚴(yán)重。由于額外的索引操作開銷,在對表進(jìn)行寫入操作的時(shí)候的性能將會(huì)有很大下降,而且索引越多,寫入性能下降也越多。
[0005](3)查詢性能不好,僅對較小的查詢有加速效果。對于大多數(shù)多維區(qū)間查詢,這種索引帶來的速度提升很有限,因?yàn)閿?shù)據(jù)表數(shù)據(jù)讀取速度慢,客戶端和服務(wù)端的來回網(wǎng)絡(luò)開銷大,只有在查詢很小的時(shí)候才相對于全表掃描有速度上的優(yōu)勢。
[0006](4)索引帶來的額外存儲開銷較大。直接使用存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)來存儲索引,沒有針對索引存儲的特點(diǎn)進(jìn)行優(yōu)化,會(huì)存儲一些無用的數(shù)據(jù),存儲開銷較大。
[0007](5) 一次查詢不能使用多列索引。在一次多維區(qū)間查詢中,因?yàn)樗饕淖x取和對數(shù)據(jù)表的讀取都在客戶端完成,客戶端資源有限,在面對存儲海量數(shù)據(jù)的分布式順序表的時(shí)候,客戶端難以完成多個(gè)索引數(shù)據(jù)合并的任務(wù)。索引不能用于帶聚集函數(shù)的服務(wù)端計(jì)算。服務(wù)端計(jì)算是單獨(dú)處理每個(gè)數(shù)據(jù)分片,對局部數(shù)據(jù)進(jìn)行計(jì)算,該索引是一種全局的索引,無法對索引進(jìn)行劃分獲得局部數(shù)據(jù)對應(yīng)的索引。
[0008]發(fā)明人在進(jìn)行分布式順序表索引及多維區(qū)間查詢技術(shù)研究時(shí),發(fā)現(xiàn)現(xiàn)有技術(shù)中的缺陷是因?yàn)樵谳^高的存儲層級,即表級維護(hù)索引,沒有針對索引存儲、使用特點(diǎn),以及分布式順序表設(shè)計(jì)原理、內(nèi)部結(jié)構(gòu)特點(diǎn)來設(shè)計(jì)和優(yōu)化索引導(dǎo)致的,發(fā)明人經(jīng)過對索引和分布式順序表的特點(diǎn)進(jìn)行深入研究發(fā)現(xiàn),解決該項(xiàng)缺陷可以通過在更低的存儲級別,即存儲文件級來維護(hù)索引,重新設(shè)計(jì)專用的索引存儲結(jié)構(gòu),充分利用分布式順序表的框架來維護(hù)和管理索引的方法來實(shí)現(xiàn)。
【發(fā)明內(nèi)容】
[0009]為解決上述問題,本發(fā)明提出了一種分布式順序表片內(nèi)二級索引方法及系統(tǒng),本發(fā)明通過對索引和分布式順序表的特點(diǎn)進(jìn)行深入研究,重新設(shè)計(jì)索引存儲結(jié)構(gòu),來減小索引存儲開銷,提高索引查詢性能,解決了一次查詢不能使用多列索引,索引不能用于服務(wù)端計(jì)算等問題,通過一致性更新模塊、合并和分裂模塊保證索引和數(shù)據(jù)的一致性,通過內(nèi)存存儲刷與1旲塊提聞數(shù)據(jù)與入性能。
[0010]為了達(dá)到本發(fā)明的目的,本發(fā)明提供了一種分布式順序表片內(nèi)二級索引方法,包括如下步驟:
[0011]SI索引布局管理步驟,為分布式順序表的每個(gè)數(shù)據(jù)分片中的每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件,該索引存儲文件存儲列名、列值、主鍵;
[0012]S2 一致性更新步驟,向該分布式順序表寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中;
[0013]S3內(nèi)存存儲刷寫步驟,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再刷寫數(shù)據(jù)記錄到磁盤上生成該數(shù)據(jù)存儲文件;
[0014]S4合并和分裂步驟,在數(shù)據(jù)分片合并時(shí),先將多個(gè)索引存儲文件合并成一個(gè)新的索引存儲文件,再將對應(yīng)的多個(gè)數(shù)據(jù)存儲文件合并成一個(gè)新的數(shù)據(jù)存儲文件;以及
[0015]在該數(shù)據(jù)片按照某主鍵分裂成兩個(gè)新數(shù)據(jù)分片時(shí),首先將該數(shù)據(jù)分片內(nèi)的每個(gè)索引存儲文件按照該主鍵分裂成兩個(gè)新索引存儲文件后分別加入到所述兩個(gè)新數(shù)據(jù)分片中,然后再把該數(shù)據(jù)分片內(nèi)的每個(gè)數(shù)據(jù)存儲文件按照該主鍵分裂成兩個(gè)新數(shù)據(jù)存儲文件后分別加入到所述的兩個(gè)新的數(shù)據(jù)分片中;
[0016]S5多維區(qū)間查詢步驟,對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),按照查詢條件對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,查詢時(shí)對該查詢條件進(jìn)行預(yù)處理得到索引查詢條件,再依次單獨(dú)查詢每列索引、合并多列索引查詢結(jié)果、讀取滿足該索引查詢條件的該些數(shù)據(jù)作為最終查詢結(jié)果。
[0017]所述一種分布式順序表片內(nèi)二級索引方法,該索引存儲文件結(jié)構(gòu)包括:多個(gè)記錄塊,記錄塊索引,文件信息和結(jié)尾,每個(gè)記錄塊存儲多條索引記錄,保存每個(gè)記錄塊中第一條索引記錄作為記錄塊索引。
[0018]所述分布式順序表片內(nèi)二級索引方法,該索引記錄結(jié)構(gòu)使用鍵值對結(jié)構(gòu)存儲,鍵主要包括列值和列名,值主要包括主鍵,鍵長度、值長度和列名長度都是用于快速讀取索引記錄的某部分。
[0019]所述一種分布式順序表片內(nèi)二級索引方法,該多維區(qū)間查詢步驟S5還包括:
[0020]在查詢每個(gè)索引存儲文件時(shí),直接二分查找該塊索引,快速查找開始、結(jié)束記錄塊的偏移位置,然后直接讀取中間所有的記錄塊以獲取滿足該索引查詢條件的主鍵集合。
[0021]所述一種分布式順序表片內(nèi)二級索引方法,該多維區(qū)間查詢步驟S5還包括:
[0022]S51預(yù)處理步驟,用戶對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),將查詢條件發(fā)送到每個(gè)數(shù)據(jù)分片后預(yù)處理該查詢條件,獲得索引查詢條件;
[0023]S52讀取主鍵步驟,分別從該索引存儲文件和該內(nèi)存存儲中查找滿足該索引查詢條件的索引記錄和數(shù)據(jù)記錄,并分別讀取該索引記錄和該數(shù)據(jù)記錄的主鍵,得到主鍵集合;
[0024]S53合并主鍵步驟,按照該索引查詢條件間關(guān)系和該查詢規(guī)模大小次序合并該主鍵集合,按主鍵排序后得到最終主鍵集合;
[0025]S54結(jié)果集生成步驟,依據(jù)最終主鍵集合查詢該數(shù)據(jù)分片中數(shù)據(jù),并把滿足該索引查詢條件的數(shù)據(jù)放入結(jié)果集中;
[0026]S55合并結(jié)果集步驟,合并每個(gè)數(shù)據(jù)分片的結(jié)果集得到最終的查詢結(jié)果集,并把該最終的查詢結(jié)果集返回給該用戶。
[0027]本發(fā)明還涉及一種分布式順序表片內(nèi)二級索引系統(tǒng),包括:
[0028]索引布局管理模塊,用于為所述分布式順序表的每個(gè)數(shù)據(jù)分片中的每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件,該索引存儲文件存儲列名、列值、主鍵;
[0029]一致性更新模塊,向該分布式順序表寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中部分未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中;
[0030]內(nèi)存存儲刷寫模塊,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再刷寫數(shù)據(jù)記錄到磁盤上生成該數(shù)據(jù)存儲文件;
[0031]合并和分裂模塊,在數(shù)據(jù)分片合并時(shí),先將多個(gè)索引存儲文件合并成一個(gè)新的索引存儲文件,再將對應(yīng)的多個(gè)數(shù)據(jù)存儲文件合并成一個(gè)新的數(shù)據(jù)存儲文件;以及
[0032]在該數(shù)據(jù)分片按照某主鍵分裂成兩個(gè)數(shù)據(jù)分片時(shí),首先將該數(shù)據(jù)分片內(nèi)的每個(gè)索引存儲文件按照該主鍵分裂成兩個(gè)索引存儲文件后分別加入到所述兩個(gè)新的數(shù)據(jù)分片中,然后再把該數(shù)據(jù)分片內(nèi)的每個(gè)數(shù)據(jù)存儲文件按照所述主鍵分裂成兩個(gè)數(shù)據(jù)存儲文件后分別加入到所述的兩個(gè)新的數(shù)據(jù)分片中;
[0033]多維區(qū)間查詢模塊,用于該分布式順序表接收多維區(qū)間查詢條件,按照該查詢條件對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,查詢時(shí)對該查詢條件進(jìn)行預(yù)處理得到索引查詢條件,再依次單獨(dú)查詢每列索引、合并多列索引查詢結(jié)果、讀取滿足該列索引查詢條件的該些數(shù)據(jù)作為最終查詢結(jié)果。
[0034]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該索引存儲文件結(jié)構(gòu)包括:多個(gè)記錄塊,記錄塊索引,文件信息和結(jié)尾,每個(gè)記錄塊存儲多條索引記錄,保存每個(gè)記錄塊中第一條索引記錄作為記錄塊索引。
[0035]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該多維區(qū)間查詢模塊還包括:
[0036]在查詢每個(gè)索引存儲文件時(shí),直接二分查找塊索引,快速查找開始、結(jié)束記錄塊的偏移位置,然后直接讀取中間所有的記錄塊以獲取滿足該索引查詢條件的主鍵集合。
[0037]所述分布式順序表片內(nèi)二級索引系統(tǒng),該索引記錄結(jié)構(gòu)使用鍵值對結(jié)構(gòu)存儲,鍵主要包括列值和列名,值主要包括主鍵,鍵長度、值長度和列名長度都是用于快速讀取索引記錄的某部分。
[0038]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該多維區(qū)間查詢模塊還包括:
[0039]預(yù)處理模塊,用于用戶對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),將查詢條件發(fā)送到每個(gè)數(shù)據(jù)分片后預(yù)處理該查詢條件,獲得索引查詢條件;
[0040]讀取主鍵模塊,用于分別從索引存儲文件和內(nèi)存存儲中查找滿足該索引查詢條件的索引記錄和數(shù)據(jù)記錄,并分別讀取該索引記錄和該數(shù)據(jù)記錄的主鍵,得到主鍵集合;
[0041]合并主鍵模塊,用于按照該索引查詢條件間關(guān)系和該查詢規(guī)模大小次序合并該主鍵集合,按主鍵排序后得到最終主鍵集合;
[0042]結(jié)果集生成模塊,用于依據(jù)最終主鍵集合查詢該數(shù)據(jù)分片中數(shù)據(jù),并把滿足該索引查詢條件的數(shù)據(jù)放入結(jié)果集中;
[0043]合并結(jié)果集模塊,用于合并每個(gè)數(shù)據(jù)分片的結(jié)果集得到最終的查詢結(jié)果集,并把該查詢結(jié)果集返回給該用戶。
[0044]由以上方案可知,本發(fā)明的優(yōu)點(diǎn)在于:
[0045](I)通過改變內(nèi)存存儲刷寫過程即可保證數(shù)據(jù)記錄和索引記錄的一致性。僅在內(nèi)存存儲刷寫的時(shí)候生成索引記錄,不需要對原有的數(shù)據(jù)恢復(fù)機(jī)制做任何的更改即可保證該內(nèi)存存儲中數(shù)據(jù)對應(yīng)的索引不丟失,索引存儲文件隨著數(shù)據(jù)存儲文件一起變遷,保證該索引存儲文件中的索引不丟失,因此可以保證整個(gè)系統(tǒng)中索引和數(shù)據(jù)的一致性。
[0046](2)數(shù)據(jù)寫入性能下降較小。由于沒有在寫入過程中沒有為索引引入額外的開銷,特別是為了保證一致性的額外開銷,僅在內(nèi)存存儲刷寫時(shí)生成索引記錄,寫入性能增加。
[0047](3)查詢性能好。索引記錄和數(shù)據(jù)記錄讀取都在數(shù)據(jù)分片內(nèi),避免了大量的來回網(wǎng)絡(luò)時(shí)間開銷,經(jīng)過查詢條件預(yù)處理、去掉較大查詢規(guī)模的索引查詢條件、按照查詢規(guī)模從小到大合并主鍵集合、最終主鍵集合排序等優(yōu)化技術(shù),查詢性能有大幅度提升。
[0048](4)索引帶來的額外存儲開銷較小。使用重新設(shè)計(jì)的專用數(shù)據(jù)結(jié)構(gòu)來存儲索引可以把索引的存儲開銷壓縮到最小。
[0049](5) 一次查詢能使用多列索引。查詢是對每個(gè)數(shù)據(jù)分片單獨(dú)進(jìn)行,絕大多數(shù)情況下每個(gè)數(shù)據(jù)分片內(nèi)的數(shù)據(jù)量不會(huì)太大,可以使用內(nèi)存對多個(gè)索引的查詢結(jié)果進(jìn)行合并,故一次查詢可以使用多列索引。
[0050](6)索引能用于帶聚集函數(shù)的服務(wù)端計(jì)算。索引的使用是在數(shù)據(jù)分片內(nèi),對服務(wù)端計(jì)算完全透明,服務(wù)端計(jì)算可以使用索引查詢數(shù)據(jù)。
【專利附圖】
【附圖說明】
[0051]圖1為分布式順序表片內(nèi)二級索引布局示意圖;
[0052]圖2為分布式順序表片內(nèi)二級索引記錄結(jié)構(gòu)圖;
[0053]圖3為分布式順序表片內(nèi)二級索引存儲文件結(jié)構(gòu)圖;
[0054]圖4為分布式順序表片內(nèi)二級索引組織示意圖;
[0055]圖5為分布式順序表片內(nèi)二級索引多維區(qū)間查詢流程圖;
[0056]其中附圖標(biāo)記為:分布式順序表片內(nèi)二級索引多維區(qū)間查詢步驟:
[0057]S51, S52, S53, S54, S55
【具體實(shí)施方式】
[0058]下面給出【具體實(shí)施方式】,結(jié)合附圖對本發(fā)明做出詳細(xì)的描述,但不作為對本發(fā)明的限定。
[0059]本發(fā)明提出了一種分布式順序表片內(nèi)二級索引方法及系統(tǒng)。具體而言,本發(fā)明將使用重新設(shè)計(jì)的專用數(shù)據(jù)結(jié)構(gòu)來存儲索引,可以把索引的存儲開銷壓縮到最小,同時(shí)索引的讀寫性能更好,本發(fā)明通過更改內(nèi)存存儲的刷寫過程,不需要對原有的數(shù)據(jù)恢復(fù)機(jī)制做任何的更改即可保證內(nèi)存存儲中數(shù)據(jù)對應(yīng)的索引不丟失,保證了內(nèi)存存儲中索引和數(shù)據(jù)的一致性,本發(fā)明通過更改合并和分裂流程,保證了存儲文件中索引和數(shù)據(jù)的一致性,本發(fā)明是對每個(gè)數(shù)據(jù)分片單獨(dú)進(jìn)行查詢,絕大多數(shù)情況下每個(gè)數(shù)據(jù)分片內(nèi)的數(shù)據(jù)量不會(huì)太大,可以使用內(nèi)存對多個(gè)索引的查詢結(jié)果進(jìn)行合并,故一次查詢可以使用多列索引。同時(shí),索引的使用是在數(shù)據(jù)分片內(nèi),對服務(wù)端計(jì)算完全透明,服務(wù)端計(jì)算可以使用索引查詢數(shù)據(jù)。另外,索引和數(shù)據(jù)讀取都在數(shù)據(jù)分片內(nèi),避免了大量的來回網(wǎng)絡(luò)時(shí)間開銷,查詢性能大幅提升,經(jīng)過查詢條件預(yù)處理、去掉較大查詢規(guī)模的索引查詢條件、按照查詢規(guī)模從小到大合并主鍵集合、最終主鍵集合排序等優(yōu)化技術(shù),查詢性能有進(jìn)一步地大幅度提升。
[0060]為了完成上述過程,本發(fā)明提供一種分布式順序表片內(nèi)二級索引方法,所述方法包括:
[0061]SI索引布局管理步驟,如圖1所示,為所述分布式順序表的每個(gè)數(shù)據(jù)分片中的每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件,該索引存儲文件存儲列名、列值、主鍵;
[0062]S2 一致性更新步驟,向該分布式順序表寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中部分未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中;
[0063]S3內(nèi)存存儲刷寫步驟,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再刷寫數(shù)據(jù)記錄到磁盤上生成該數(shù)據(jù)存儲文件;
[0064]S4合并和分裂步驟,在數(shù)據(jù)分片合并時(shí),先將多個(gè)索引存儲文件合并成一個(gè)新的索引存儲文件,再將對應(yīng)的多個(gè)數(shù)據(jù)存儲文件合并成一個(gè)新的數(shù)據(jù)存儲文件;以及
[0065]在該數(shù)據(jù)分片按照某主鍵分裂成兩個(gè)數(shù)據(jù)片時(shí),首先將該數(shù)據(jù)分片內(nèi)的每個(gè)索引存儲文件按照該主鍵分裂成兩個(gè)索引存儲文件后分別加入到所述兩個(gè)新的數(shù)據(jù)分片中,然后再把該數(shù)據(jù)分片內(nèi)的每個(gè)數(shù)據(jù)存儲文件按照所述主鍵分裂成兩個(gè)數(shù)據(jù)存儲文件后分別加入到所述的兩個(gè)新的數(shù)據(jù)分片中;
[0066]S5多維區(qū)間查詢步驟,該分布式順序表接收多維區(qū)間查詢條件,按照該查詢條件對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,查詢時(shí)對該查詢條件進(jìn)行預(yù)處理得到索引查詢條件,再依次單獨(dú)查詢每列索引、合并多列索引查詢結(jié)果、讀取數(shù)據(jù)作為最終查詢結(jié)果。
[0067]如圖2所示,該索引記錄結(jié)構(gòu)使用鍵值對數(shù)據(jù)結(jié)構(gòu)存儲,“鍵”包括列名和列值,“值”包括包括主鍵,鍵長度、值長度和列名長度都是用于快速讀取索引記錄的某個(gè)部分。索弓I記錄依次按照列名、列值、主鍵來排序。
[0068]如圖3所示,該索引存儲文件結(jié)構(gòu)包括:多個(gè)記錄塊,記錄塊索引,文件信息和結(jié)尾,每個(gè)記錄塊存儲多條索引記錄,保存每個(gè)記錄塊中第一條索引記錄作為記錄塊索引,在查詢每個(gè)索引存儲文件時(shí),直接二分查找塊索引,快速查找開始、結(jié)束記錄塊的偏移位置,然后直接讀取中間所有的記錄塊以獲取滿足該索引查詢條件的主鍵集合。該文件信息中存儲的是文件的幾個(gè)統(tǒng)計(jì)數(shù)據(jù),大小不是固定的,該結(jié)尾的大小是固定的,存儲各部分的偏移和一些其他文件統(tǒng)計(jì)信息。
[0069]如圖4所示,本發(fā)明具體實(shí)施所述的面向分布式順序表的片內(nèi)二級索引的索引組織示例。所述分布式順序表共有三列,即Cl,c2和c3。為其中兩列Cl和c2分別添加片內(nèi)二級索引,系統(tǒng)會(huì)為每個(gè)數(shù)據(jù)存儲文件維護(hù)對應(yīng)的索引存儲文件,并且把該數(shù)據(jù)存儲文件中Cl和c2兩列的類型不為“刪除”的數(shù)據(jù)記錄寫入到該索引存儲文件中,cl、c2為索引列,c3為非索引列。該數(shù)據(jù)存儲文件中每條數(shù)據(jù)記錄有五個(gè)屬性:主鍵、列名、時(shí)間戳、類型和列值,并依次按照主鍵、列名、時(shí)間戳和類型排序,該索引存儲文件中每條索引記錄有三個(gè)屬性:列名、列值和主鍵,并依次按照列名、列值、主鍵排序。
[0070]所述一種分布式順序表片內(nèi)二級索引方法,該多維區(qū)間查詢步驟S5還包括:
[0071]S51預(yù)處理步驟,用戶對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),將查詢條件發(fā)送到每個(gè)數(shù)據(jù)分片后預(yù)處理該查詢條件,獲得索引查詢條件;進(jìn)一步地說,當(dāng)接收到區(qū)間查詢請求時(shí),把查詢請求分別送到每個(gè)數(shù)據(jù)分片,在數(shù)據(jù)分片內(nèi),首先對所述查詢請求中的查詢條件進(jìn)行條件合并和去重、索引條件篩選和較大查詢規(guī)模的索引條件去除等預(yù)處理步驟,得到最終的索引查詢條件。
[0072]S52讀取主鍵步驟,分別從索引存儲文件和內(nèi)存存儲中查找滿足該索引查詢條件的索引記錄和數(shù)據(jù)記錄,并分別讀取該索引記錄和該數(shù)據(jù)記錄的主鍵,得到主鍵集合;
[0073]S53合并主鍵步驟,按照該索引查詢條件間關(guān)系和該查詢規(guī)模大小次序合并該主鍵集合,按主鍵排序后得到最終主鍵集合;進(jìn)一步說,按照索引查詢條件間的“與”或者“或”關(guān)系合并各自的主鍵集合,合并時(shí)按照查詢規(guī)模從小到大的順序進(jìn)行,最后得到一個(gè)合并后的主鍵集合,對其按照主鍵進(jìn)行排序,得到最終主鍵集合;
[0074]S54結(jié)果集生成步驟,依據(jù)最終主鍵集合查詢該數(shù)據(jù)分片中的數(shù)據(jù),并把滿足該索引查詢條件的數(shù)據(jù)放入結(jié)果集中;進(jìn)一步說,依據(jù)所述最終主鍵值集合,從該數(shù)據(jù)分片的所有數(shù)據(jù)存儲文件和內(nèi)存存儲中讀取相應(yīng)的數(shù)據(jù),并用查詢條件對該數(shù)據(jù)進(jìn)行篩選,把滿足該查詢條件的數(shù)據(jù)記錄放入查詢結(jié)果集中;
[0075]S55合并結(jié)果集步驟,合并每個(gè)數(shù)據(jù)分片的結(jié)果集得到最終的查詢結(jié)果集,并把該最終的查詢結(jié)果集返回給該用戶。
[0076]現(xiàn)在列舉本發(fā)明的一個(gè)實(shí)施例,下面的實(shí)施例基于Apache HBase來創(chuàng)建本發(fā)明所述的片內(nèi)二級索引方法及系統(tǒng),HBase是一種典型的分布式順序表,構(gòu)建于ApacheHadoop (用于構(gòu)建大規(guī)模共享存儲和計(jì)算設(shè)施的軟件)之上。一個(gè)HBase (分布式順序表)系統(tǒng)包括一個(gè)HMaster (主服務(wù)節(jié)點(diǎn))和多個(gè)HReg1nServer (數(shù)據(jù)服務(wù)節(jié)點(diǎn))。
[0077]本發(fā)明所述的片內(nèi)二級索引采用HBase-0.94.16作為代碼基礎(chǔ),采用Java語言實(shí)現(xiàn)。在HBase中為每個(gè)HReg1n (數(shù)據(jù)分片)中的每個(gè)HFile (數(shù)據(jù)存儲文件)維護(hù)一個(gè)對應(yīng)的IndexFile (索引存儲文件)。與HFile存儲KeyValue (數(shù)據(jù)記錄)類似,IndexFile存儲IndexKeyValue (索引記錄)。IndexKeyValue是一種類似KeyValue的存儲結(jié)構(gòu),與KeyValue在存儲內(nèi)容上的主要區(qū)別在于不存儲列名、時(shí)間戳和類型。KeyValue結(jié)構(gòu)按照主鍵、列名、時(shí)間戳、類型、列值進(jìn)行排序,而IndexKeyValue結(jié)構(gòu)按照列名、列值、主鍵進(jìn)行排序。另外,MemStore (內(nèi)存存儲)中的數(shù)據(jù)不維護(hù)索引,在MemStore刷寫生成HFile的之前先生成對應(yīng)的IndexFile。
[0078]在進(jìn)行Minor (次)合并時(shí),將多個(gè)小HFile合并成一個(gè)較大HFile的之前先將對應(yīng)的多個(gè)IndexFile合并成一個(gè)大的IndexFile。在進(jìn)行Major (主)合并時(shí),在多個(gè)HFile合并成一個(gè)大的HFile之后,從新生成的HFile中生成IndexKeyValue列表后還需要在內(nèi)存中進(jìn)行排序,為了控制內(nèi)存的使用,設(shè)置一個(gè)可以使用的最大內(nèi)存量,在內(nèi)存裝滿后,將排序好的IndexKeyValue刷寫到磁盤上生成臨時(shí)的IndexFile,最后再將多個(gè)臨時(shí)IndexFile合并成一個(gè)最終的IndexFile。
[0079]在HReg1n分裂時(shí),父HReg1n中的HFile并沒有立即分裂,子HReg1n只是對父HReg1n中所有的HFile創(chuàng)建了一個(gè)對應(yīng)的ReferenceFile (應(yīng)用文件),在子HReg1n做合并的時(shí)候才會(huì)真正生成存有實(shí)際數(shù)據(jù)的HFile,合并之前都是通過讀取父HReg1n中被引用的HFile。基于這個(gè)原理,可以對HReg1n分裂過程不做任何更改,而是在HReg1n上線時(shí),如果發(fā)現(xiàn)有ReferenceFile,就同時(shí)讀取被引用的HFile對應(yīng)的IndexFile,在HReg1n合并之后真正生成自己的IndexFile。
[0080]在對數(shù)據(jù)表進(jìn)行多維區(qū)間查詢時(shí),把查詢請求分別送到每個(gè)HReg1n中單獨(dú)查詢。在每個(gè)HReg1n內(nèi)查詢時(shí),首先對查詢條件進(jìn)行預(yù)處理,得到索引查詢條件,再查詢IndexFile中的索引和MemStore中的數(shù)據(jù),得到滿足索引查詢條件的主鍵集合,然后對多個(gè)索引查詢條件的查詢結(jié)果進(jìn)行合并,根據(jù)他們之間的關(guān)系和查詢規(guī)模大小次序合并各自得到主鍵集合,并對合并后的主鍵集合按照主鍵排序得到最終的主鍵集合,最后根據(jù)最終主鍵集合中的主鍵在HReg1n中的HFile和MemStore中讀出整行數(shù)據(jù),并使用該查詢條件進(jìn)一步判斷,把滿足該查詢條件的數(shù)據(jù)放入查詢結(jié)果集中。最后把每個(gè)HReg1n的查詢結(jié)果集進(jìn)行合并,得到最終的查詢結(jié)果集。
[0081]本發(fā)明還涉及一種分布式順序表片內(nèi)二級索引系統(tǒng),包括:
[0082]索引布局管理模塊,用于為所述分布式順序表的每個(gè)數(shù)據(jù)分片中的每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件,該索引存儲文件存儲列名、列值、主鍵;
[0083]一致性更新模塊,向該分布式順序表寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中部分未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中;
[0084]內(nèi)存存儲刷寫模塊,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再刷寫數(shù)據(jù)記錄到磁盤上生成該數(shù)據(jù)存儲文件;
[0085]合并和分裂模塊,在數(shù)據(jù)片合并時(shí),先將多個(gè)索引存儲文件合并成一個(gè)新的索引存儲文件,再將對應(yīng)的多個(gè)數(shù)據(jù)存儲文件合并成一個(gè)新的數(shù)據(jù)存儲文件;以及
[0086]在該數(shù)據(jù)片按照某主鍵分裂成兩個(gè)數(shù)據(jù)片時(shí),首先將該數(shù)據(jù)分片內(nèi)的每個(gè)索引存儲文件按照該主鍵分裂成兩個(gè)索引存儲文件后分別加入到所述兩個(gè)新的數(shù)據(jù)分片中,然后再把該數(shù)據(jù)分片內(nèi)的每個(gè)數(shù)據(jù)存儲文件按照所述主鍵分裂成兩個(gè)數(shù)據(jù)存儲文件后分別加入到所述的兩個(gè)新的數(shù)據(jù)分片中;
[0087]多維區(qū)間查詢模塊,用于該分布式順序表接收多維區(qū)間查詢條件,按照該查詢條件對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,查詢時(shí)對該查詢條件進(jìn)行預(yù)處理得到索引查詢條件,再依次單獨(dú)查詢每列索引、合并多列索引查詢結(jié)果、讀取數(shù)據(jù)作為最終查詢結(jié)果。
[0088]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該索引存儲文件結(jié)構(gòu)包括:多個(gè)記錄塊,記錄塊索引,文件信息和結(jié)尾,每個(gè)記錄塊存儲多條索引記錄,保存每個(gè)記錄塊中第一條索引記錄作為記錄塊索引。
[0089]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該索引記錄結(jié)構(gòu)使用鍵值對數(shù)據(jù)結(jié)構(gòu)存儲,“鍵”包括列名和列值,“值”包括包括主鍵,鍵長度、值長度和列名長度都是用于快速讀取索引記錄的某個(gè)部分。索引記錄依次按照列名、列值、主鍵來排序。
[0090]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該多維區(qū)間查詢模塊還包括:
[0091]在查詢每個(gè)索引存儲文件時(shí),直接二分查找塊索引,快速查找開始、結(jié)束記錄塊的偏移位置,然后直接讀取中間所有的記錄塊以獲取滿足該索引查詢條件的主鍵集合。
[0092]所述一種分布式順序表片內(nèi)二級索引系統(tǒng),該多維區(qū)間查詢模塊還包括:
[0093]預(yù)處理模塊,用于用戶對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),將查詢條件發(fā)送到每個(gè)數(shù)據(jù)分片后預(yù)處理該查詢條件,獲得索引查詢條件;
[0094]讀取主鍵模塊,用于分別從索引存儲文件和內(nèi)存存儲中查找滿足該索引查詢條件的索引記錄和數(shù)據(jù)記錄,并分別讀取該索引記錄和該數(shù)據(jù)記錄的主鍵,得到主鍵集合;
[0095]合并主鍵模塊,用于按照該索引查詢條件間關(guān)系和該查詢規(guī)模大小次序合并該主鍵集合,按主鍵排序后得到最終主鍵集合;
[0096]結(jié)果集生成模塊,用于依據(jù)最終主鍵集合查詢該數(shù)據(jù)分片中數(shù)據(jù),并把滿足該索引查詢條件的數(shù)據(jù)放入結(jié)果集中;
[0097]合并結(jié)果集模塊,用于合并每個(gè)數(shù)據(jù)分片的結(jié)果集得到最終的查詢結(jié)果集,并把該最終的查詢結(jié)果集返回給該用戶。
【權(quán)利要求】
1.一種分布式順序表片內(nèi)二級索引方法,其特征在于,包括如下步驟: Si索引布局管理步驟,為分布式順序表的每個(gè)數(shù)據(jù)分片中的每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件,該索引存儲文件存儲列名、列值、主鍵; S2 一致性更新步驟,向該分布式順序表寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中; S3內(nèi)存存儲刷寫步驟,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再刷寫該數(shù)據(jù)記錄到磁盤上生成該數(shù)據(jù)存儲文件; S4合并和分裂步驟,在數(shù)據(jù)分片合并時(shí),先將多個(gè)索引存儲文件合并成一個(gè)新的索引存儲文件,再將對應(yīng)的多個(gè)數(shù)據(jù)存儲文件合并成一個(gè)新的數(shù)據(jù)存儲文件;以及 在該數(shù)據(jù)片按照某主鍵分裂成兩個(gè)新數(shù)據(jù)分片時(shí),首先將該數(shù)據(jù)分片內(nèi)的每個(gè)索引存儲文件按照該主鍵分裂成兩個(gè)新索引存儲文件后分別加入到所述兩個(gè)新數(shù)據(jù)分片中,然后再把該數(shù)據(jù)分片內(nèi)的每個(gè)數(shù)據(jù)存儲文件按照該主鍵分裂成兩個(gè)新數(shù)據(jù)存儲文件后分別加入到所述的兩個(gè)新的數(shù)據(jù)分片中; S5多維區(qū)間查詢步驟,對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),按照查詢條件對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,查詢時(shí)對該查詢條件進(jìn)行預(yù)處理得到索引查詢條件,再依次單獨(dú)查詢每列索引、合并多列索引查詢結(jié)果、讀取滿足該索引查詢條件的該些數(shù)據(jù)作為最終查詢結(jié)果O
2.如權(quán)利要求1所述分布式順序表片內(nèi)二級索引方法,其特征在于,該索引存儲文件結(jié)構(gòu)包括:多個(gè)記錄塊,記錄塊索引,文件信息和結(jié)尾,每個(gè)記錄塊存儲多條索引記錄,保存每個(gè)記錄塊中第一條索引記錄作為記錄塊索引。
3.如權(quán)利要求1所述分布式順序表片內(nèi)二級索引方法,其特征在于,該索引記錄結(jié)構(gòu)使用鍵值對結(jié)構(gòu)存儲,鍵主要包括列值和列名,值主要包括主鍵,鍵長度、值長度和列名長度都是用于快速讀取索引記錄的某部分。
4.如權(quán)利要求1所述一種分布式順序表片內(nèi)二級索引方法,其特征在于,該多維區(qū)間查詢步驟S5還包括: 查詢每個(gè)索引存儲文件時(shí),直接二分查找該塊索引,快速查找開始、結(jié)束記錄塊的偏移位置,然后直接讀取中間所有的記錄塊以獲取滿足該索引查詢條件的主鍵集合。
5.如權(quán)利要求1所述分布式順序表片內(nèi)二級索引方法,其特征在于,該多維區(qū)間查詢步驟S5還包括: S51,用戶對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),將查詢條件發(fā)送到每個(gè)數(shù)據(jù)分片后預(yù)處理該查詢條件,獲得索引查詢條件; S52,分別從該索弓I存儲文件和該內(nèi)存存儲中查找滿足該索弓I查詢條件的索引記錄和數(shù)據(jù)記錄,并分別讀取該索引記錄和該數(shù)據(jù)記錄的主鍵,得到主鍵集合; S53,按照該索引查詢條件間關(guān)系和該查詢規(guī)模大小次序合并該主鍵集合,按主鍵排序后得到最終主鍵集合; S54,依據(jù)最終主鍵集合查詢該數(shù)據(jù)分片中數(shù)據(jù),并把滿足該索引查詢條件的數(shù)據(jù)放入結(jié)果集中; S55,合并每個(gè)數(shù)據(jù)分片的結(jié)果集得到最終的查詢結(jié)果集,并把該最終的查詢結(jié)果集返回給該用戶。
6.一種分布式順序表片內(nèi)二級索引系統(tǒng),其特征在于,包括: 索引布局管理模塊,用于為所述分布式順序表的每個(gè)數(shù)據(jù)分片中的每個(gè)數(shù)據(jù)存儲文件創(chuàng)建對應(yīng)的索引存儲文件,該索引存儲文件存儲列名、列值、主鍵; 一致性更新模塊,向該分布式順序表寫入數(shù)據(jù)時(shí),先將該數(shù)據(jù)寫入預(yù)寫日志中,再寫入內(nèi)存存儲中,若該內(nèi)存存儲中該數(shù)據(jù)部分丟失,將該預(yù)寫入日志中部分未成功寫入磁盤上的該數(shù)據(jù)重新寫入該內(nèi)存存儲中; 內(nèi)存存儲刷寫模塊,若該內(nèi)存存儲存量達(dá)到某閾值,先生成該內(nèi)存存儲中類型不為“刪除”的數(shù)據(jù)記錄對應(yīng)的索引記錄,并刷寫該索引記錄到該磁盤上生成該索引存儲文件,再刷寫數(shù)據(jù)記錄到磁盤上生成該數(shù)據(jù)存儲文件; 合并和分裂模塊,在數(shù)據(jù)分片合并時(shí),先將多個(gè)索引存儲文件合并成一個(gè)新的索引存儲文件,再將對應(yīng)的多個(gè)數(shù)據(jù)存儲文件合并成一個(gè)新的數(shù)據(jù)存儲文件;以及 在該數(shù)據(jù)分片按照某主鍵分裂成兩個(gè)數(shù)據(jù)片時(shí),首先將該數(shù)據(jù)分片內(nèi)的每個(gè)索引存儲文件按照該主鍵分裂成兩個(gè)索引存儲文件后分別加入到所述兩個(gè)新的數(shù)據(jù)分片中,然后再把該數(shù)據(jù)分片內(nèi)的每個(gè)數(shù)據(jù)存儲文件按照所述主鍵分裂成兩個(gè)數(shù)據(jù)存儲文件后分別加入到所述的兩個(gè)新的數(shù)據(jù)分片中; 多維區(qū)間查詢模塊,用于該分布式順序表接收多維區(qū)間查詢條件,按照該查詢條件對每個(gè)數(shù)據(jù)分片單獨(dú)查詢,查詢時(shí)對該查詢條件進(jìn)行預(yù)處理得到索引查詢條件,再依次單獨(dú)查詢每列索引、合并多列索引查詢結(jié)果、讀取滿足該列索引查詢條件的該些數(shù)據(jù)作為最終查詢結(jié)果。
7.如權(quán)利要求6所述分布式順序表片內(nèi)二級索引系統(tǒng),其特征在于,該索引存儲文件結(jié)構(gòu)包括:多個(gè)記錄塊,記錄塊索引,文件信息和結(jié)尾,每個(gè)記錄塊存儲多條索引記錄,保存每個(gè)記錄塊中第一條索引記錄作為記錄塊索引。
8.如權(quán)利要求6所述分布式順序表片內(nèi)二級索引系統(tǒng),其特征在于,該多維區(qū)間查詢模塊還包括:在查詢每個(gè)索引存儲文件時(shí),直接二分查找塊索引,快速查找開始、結(jié)束記錄塊的偏移位置,然后直接讀取中間所有的記錄塊以獲取滿足該索引查詢條件的主鍵集合。
9.如權(quán)利要求6所述分布式順序表片內(nèi)二級索引系統(tǒng),其特征在于,該索引記錄結(jié)構(gòu)使用鍵值對結(jié)構(gòu)存儲,鍵主要包括列值和列名,值主要包括主鍵,鍵長度、值長度和列名長度都是用于快速讀取索引記錄的某部分。
10.如權(quán)利要求6所述分布式順序表片內(nèi)二級索引系統(tǒng),其特征在于,該多維區(qū)間查詢模塊還包括: 預(yù)處理模塊,用于用戶對該分布式順序表進(jìn)行多維區(qū)間查詢時(shí),將查詢條件發(fā)送到每個(gè)數(shù)據(jù)分片后預(yù)處理該查詢條件,獲得索引查詢條件; 讀取主鍵模塊,用于分別從索引存儲文件和內(nèi)存存儲中查找滿足該索引查詢條件的索引記錄和數(shù)據(jù)記錄,并分別讀取該索引記錄和該數(shù)據(jù)記錄的主鍵,得到主鍵集合; 合并主鍵模塊,用于按照該索引查詢條件間關(guān)系和該查詢規(guī)模大小次序合并該主鍵集合,按主鍵排序后得到最終主鍵集合; 結(jié)果集生成模塊,用于依據(jù)最終主鍵集合查詢該數(shù)據(jù)分片中數(shù)據(jù),并把滿足該索引查詢條件的數(shù)據(jù)放入結(jié)果集中; 合并結(jié)果集模塊,用于合并每個(gè)數(shù)據(jù)分片的結(jié)果集得到最終的查詢結(jié)果集,并把該查詢結(jié)果集返回給該用戶。
【文檔編號】G06F17/30GK104133867SQ201410345063
【公開日】2014年11月5日 申請日期:2014年7月18日 優(yōu)先權(quán)日:2014年7月18日
【發(fā)明者】查禮, 萬浩, 程學(xué)旗 申請人:中國科學(xué)院計(jì)算技術(shù)研究所