一種基于HFile的HBase二級索引更新方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及大數(shù)據(jù)存儲與處理中SQL解析以及信息索引和搜索領(lǐng)域,特別是涉及一種基于HFile的HBase 二級索引更新方法及系統(tǒng)。
【背景技術(shù)】
[0002]在數(shù)據(jù)高速發(fā)展的時(shí)代,分布式體系成為了很重要的角色。在大數(shù)據(jù)發(fā)展的背景下,分布式集群,分布式數(shù)據(jù)庫,分布式文件系統(tǒng)都成為受人們關(guān)注的焦點(diǎn)。在這個(gè)動力趨勢下,Hadoop集群成為較成熟的分布式系統(tǒng)。分布式數(shù)據(jù)庫HBase在Hadoop生態(tài)系統(tǒng)中正在不斷完善,HBase不同于傳統(tǒng)的數(shù)據(jù)庫,它是一個(gè)適用于非結(jié)構(gòu)化數(shù)據(jù)存儲的數(shù)據(jù)庫,具有高擴(kuò)展性、列存儲、可伸縮、能實(shí)時(shí)讀寫大數(shù)據(jù)的特點(diǎn),因此被很多大公司使用,HBase數(shù)據(jù)庫依據(jù)有很好的易用性及鍵值的靈活處理得到廣泛的歡迎。
[0003]和傳統(tǒng)的基于行的關(guān)系型的數(shù)據(jù)庫不同,HBase應(yīng)用基于列的數(shù)據(jù)存儲模型,準(zhǔn)確的說,HBase是一種稀疏的面向數(shù)據(jù)的列存儲的分布式數(shù)據(jù)庫,HBase源數(shù)據(jù)表的RowKey按照字典排序,HBase源數(shù)據(jù)表的Reg1n按照HBase的RowKey設(shè)置的分割點(diǎn)進(jìn)行分片,通過這種方式實(shí)現(xiàn)數(shù)據(jù)的組織。由此,HBase數(shù)據(jù)庫中的RowKey實(shí)際上充當(dāng)著數(shù)據(jù)表的一級索引,基于索引檢索數(shù)據(jù)只能單純地依靠RowKey。為了支持多條件查詢,開發(fā)者需要將所有可能作為查詢條件的字段拼接到RowKey中,無論怎么設(shè)計(jì),單一的RowKey固有的局限性決定了它不能有效的支持多條件查詢。RowKey只能針對條件中含有其首字段的查詢給予令人滿意的性能支持,在查詢其他字段時(shí),表現(xiàn)就差強(qiáng)人意了。在極端情況下某些字段的查詢性能可能會退化為全表掃描的水平,這是因?yàn)樽侄卧赗owKey中的地位是不等價(jià)的,它們在RowKey中的排位決定了它們被檢索時(shí)的性能表現(xiàn),排序越靠前的字段在查詢中越具有優(yōu)勢,特別是首位字段具有特別的先發(fā)優(yōu)勢,如果查詢中包含首位字段,檢索時(shí)就可以通過首位字段的值確定RowKey的前綴部分,從而大幅度地收窄檢索區(qū)間,如果不包含則只能在全體數(shù)據(jù)的RowKey上逐一查找,由此可以想見兩者在性能上的差距。
[0004]除此之外,單一的依靠RowKey來支持定位目標(biāo)數(shù)據(jù)已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足實(shí)際工作中的需求,當(dāng)用戶的搜索目標(biāo)列并不僅局限于主鍵RowKey的信息時(shí),此時(shí)需要找到所需要的目標(biāo)數(shù)據(jù)往往需要進(jìn)行全表掃描,而全表掃描所需要的時(shí)間開銷與表格的大小成正比,這對用戶來說,通常是無法忍受。因此如何快速的定位到目標(biāo)數(shù)據(jù)行成為HBase在實(shí)際檢索應(yīng)用中的一個(gè)很大的功能缺陷和性能瓶頸。此時(shí)需要使用到一種特殊的索引,能在給定的列中存儲有關(guān)重要的詞及位置的信息,使用這些信息可以快速進(jìn)行全文查詢,搜索包括特定詞或詞組的行,實(shí)現(xiàn)全文索引功能。為了使用全文索引功能,目前來說,通常是使用索引引擎對HBase源數(shù)據(jù)表中的數(shù)據(jù)建立二級索引表,再通過索引搜索功能在二級索引表中得到對應(yīng)的HBase主鍵信息,進(jìn)而定位到目標(biāo)數(shù)據(jù)行,也就是說,當(dāng)HBase中存儲的源數(shù)據(jù)表需要更新時(shí),譬如,用戶刪除/增加/修改數(shù)據(jù),所對應(yīng)的二級索引的數(shù)據(jù)也應(yīng)該相應(yīng)的發(fā)生變化。
[0005]如何根據(jù)HBase源數(shù)據(jù)表的變化來更新二級索引表目前存在幾種不同的方法,這些方法從更新時(shí)機(jī)上主要分為實(shí)時(shí)更新和非實(shí)時(shí)增量更新,從更新方法上來說,主要有基于HBase提供的coprocessor機(jī)制以及基于HBase的replicat1n機(jī)制,這兩種方法的基本原理如下。
[0006]基于coprocessor機(jī)制,其核心原理是修改HBase的coprocessor代碼框架對應(yīng)的post put和post delete函數(shù),增加對應(yīng)的處理。參照圖1為coprocessor機(jī)制的原理示意圖。
[0007]當(dāng)用戶利用HBase客戶端對數(shù)據(jù)進(jìn)行一個(gè)操作后,對應(yīng)產(chǎn)生一條修改數(shù)據(jù)Data,該操作包括增、刪或改,隨后,除了依照常規(guī)將該修改數(shù)據(jù)Data寫入一 HBase源數(shù)據(jù)表之夕卜,還額外將該修改數(shù)據(jù)Data寫入一個(gè)指定的表中,這個(gè)表稱為操作信息記錄表。該操作信息記錄表由HBase進(jìn)行維護(hù)。HBase還設(shè)置有一個(gè)系統(tǒng)定時(shí)器,利用該系統(tǒng)定時(shí)器周期性的啟動更新過程。當(dāng)該系統(tǒng)定時(shí)器指示達(dá)到一更新時(shí)間點(diǎn)時(shí),利用一索引引擎讀取該操作信息記錄表中的信息,該索引引擎據(jù)以更新二級索引表中的數(shù)據(jù),由此來同步二級索引表與HBase源數(shù)據(jù)表。
[0008]但是,這一方法的不足之處在于,當(dāng)用戶進(jìn)行操作之后,需多寫入一份數(shù)據(jù)在該操作信息記錄表中,并由HBase對表中數(shù)據(jù)進(jìn)行維護(hù)。也就是說,用戶每次進(jìn)行操作后,都需額外進(jìn)行一次寫操作,進(jìn)而多出了一份額外的寫開銷,這樣增加了用戶操作數(shù)據(jù)的負(fù)擔(dān)。并且,對于HBase客戶端而言,需要等待針對HBase源數(shù)據(jù)表、操作信息記錄表的兩次寫操作都成功,分別返回成功消息后,才能繼續(xù)執(zhí)行后續(xù)的邏輯操作,特別是才能進(jìn)行下一次操作以提供下一條修改數(shù)據(jù)Data,使得用戶在兩次操作之間需要等待。這等待的過程增加了時(shí)間開銷,同時(shí)也承擔(dān)一定的風(fēng)險(xiǎn)。風(fēng)險(xiǎn)在于額外的寫操作可能發(fā)生失效或者出錯(cuò),而HBase在針對該失效或者出錯(cuò)進(jìn)行處置的過程中,用戶依然需要等待,無法利用HBase客戶端進(jìn)行后續(xù)操作,可見,用戶每次更新數(shù)據(jù)(增/刪/改)時(shí),都需要額外的時(shí)間開銷,這在很大程度上,影響用戶體驗(yàn)。
[0009]基于replicat1n機(jī)制,其核心機(jī)制利用了 HBase的replicat1n功能的基本原理,使用到主集群的HLog。參照圖2為replicat1n機(jī)制的原理示意圖。
[0010]當(dāng)用戶利用HBase客戶端對數(shù)據(jù)進(jìn)行一個(gè)操作后,對應(yīng)產(chǎn)生一條修改數(shù)據(jù)Data,則該修改數(shù)據(jù)Data被直接寫入HLog。HBase客戶端可以不做等待的持續(xù)進(jìn)行操作,產(chǎn)生多條修改數(shù)據(jù)Data,依次寫入HLog。并且,每條修改數(shù)據(jù)Data還保留一份于內(nèi)存中,當(dāng)內(nèi)存中具有多條修改數(shù)據(jù)Data并達(dá)到HFile的容量要求時(shí),形成一個(gè)HFile,并立即利用該HFile來更新HBase源數(shù)據(jù)表。該HLog位于磁盤中,故而,即使遭遇斷電等中斷操作,該修改數(shù)據(jù)依然存在,能夠保證數(shù)據(jù)處理的準(zhǔn)確性。HBase實(shí)時(shí)讀取HLog中的數(shù)據(jù),然后發(fā)送到從集群中去,根據(jù)發(fā)送的數(shù)據(jù),使用索引引擎來讀取,進(jìn)而更新現(xiàn)有的二級索引表,由此來同步索引數(shù)據(jù)與原表數(shù)據(jù)。另外,HBase還實(shí)時(shí)將HLog中的數(shù)據(jù)發(fā)送至一 HBase源數(shù)據(jù)表的備份表中進(jìn)行存儲。
[0011 ] 但是,這一方法的不足之處在于,首先replicat1n功能目前只是HBase的一個(gè)實(shí)驗(yàn)性功能,且HBase不同版本之間該功能實(shí)現(xiàn)差別很大,低級版本需要額外過濾數(shù)據(jù)操作,進(jìn)而效率較低,另外,這種更新方案相當(dāng)于修改了 HBase已有的replicat1n機(jī)制,即需要修改HBase的源代碼,無法確定是否有邊際副效應(yīng)。
【發(fā)明內(nèi)容】
[0012]本發(fā)明解決的技術(shù)問題在于,基于HBase文件存儲中的HFile這一粒度層次來確定索引更新,降低用戶的等待時(shí)間,改善用戶體驗(yàn)。
[0013]進(jìn)一步的,保證了二級索引表與HBase源數(shù)據(jù)表的一致性,確保了解析HFile文件的完整性。
[0014]進(jìn)一步的,不需要大幅度修改HBase源碼,沒有額外的寫操作。
[0015]更進(jìn)一步的,改善基于HBase數(shù)據(jù)庫的復(fù)雜查詢,減少數(shù)據(jù)查詢時(shí)間,保證全文索引功能的實(shí)現(xiàn)。
[0016]本發(fā)明公開了一種基于HFile的HBase 二級索引更新方法,該方法包括:
[0017]解析步驟,監(jiān)視HBase數(shù)據(jù)庫刷新HFile文件的過程,當(dāng)針對目標(biāo)索引列產(chǎn)生了用戶操作并生成有HFile文件時(shí),解析該HFile文件并據(jù)以更新二級索引表;
[0018]延遲步驟,在到達(dá)HFile文件的compact1n操作的啟動時(shí)間點(diǎn)時(shí),判斷該compact1n操作所對應(yīng)的HFile文件是否已經(jīng)執(zhí)行該解析該HFile文件的步驟,如果否,延遲該compact1n操作的啟動時(shí)間點(diǎn),如果是,執(zhí)行該compact1n操作。
[0019]所述的方法還包括:針對已解析的HFi 1 e文件,在其元信息中增加已解析標(biāo)志位。
[0020]該目標(biāo)索引列是根據(jù)該HBase源數(shù)據(jù)表中的索引元數(shù)據(jù)信息而確定。
[0021]該解析該HFile文件并據(jù)以更新二級索引表的步驟進(jìn)一步包括:讀取該HFile文件的KV對作為更新信息,調(diào)用一索引引擎并利用該更新信息更新該二級索引表。
[0022]所述的方法還包括重復(fù)執(zhí)行該延遲步驟,直到不再產(chǎn)生該HFile文件。
[0023]本發(fā)明還公開了一種基于HFile的HBase 二級索引更新系統(tǒng),該系統(tǒng)包括:
[0024]解析單元,用于監(jiān)視HBase數(shù)據(jù)庫刷新HFile文件的過程,當(dāng)針對目標(biāo)索引列產(chǎn)生了用戶操作并生成有HFile文件時(shí),解析該HFile文件并據(jù)以更新二級索引表;
[0025]延遲單元,在到達(dá)HFile文件的compact1n操作的啟動時(shí)間點(diǎn)時(shí),判斷該compact1n操作所對應(yīng)的HFile文件是否已經(jīng)執(zhí)行該解析該HFile文件的步驟,如果否,延遲該compact1n操作的啟動時(shí)間點(diǎn),如果是,執(zhí)行該compact1n操作。
[0026]該系統(tǒng)還包括標(biāo)志位增加模塊,用于針對已解析的HFile文件,在其元信息中增加已解析標(biāo)志位。
[0027]該目標(biāo)索引列是根據(jù)該HBase源數(shù)據(jù)表中的索引元數(shù)據(jù)信息而確定。
[0028]該解析單元進(jìn)一步包括更新模塊,用于讀取該HFile文件的KV對作為更新信息,調(diào)用一索引引擎并利用該更新信息更新該二級索引表。
[0029]該系統(tǒng)還包括循環(huán)模塊,用于重復(fù)調(diào)用該延遲單元,直到不再產(chǎn)生該HFile文件。
[0030]本發(fā)明實(shí)現(xiàn)的技術(shù)效果在于,通過利用HBase自身存儲機(jī)制所具有的HFile文件,避免了用戶每操作一次均需要等待該操作更新二級索引表完畢才能繼續(xù)操作的缺陷,同時(shí)避免了多次的寫操作。另外,本發(fā)明通過索引元數(shù)據(jù)信息,當(dāng)新生成需要跟蹤的HFile文件時(shí),才對這些文件進(jìn)行解析,并將解析結(jié)果發(fā)送到索引引擎以進(jìn)行更新,以此最終達(dá)到索引更新目的。另外,本發(fā)明的二級索引更新方法,可以改善基于HBase數(shù)據(jù)庫的復(fù)雜查詢,減少數(shù)據(jù)查詢時(shí)間,保證全文索引功能的實(shí)現(xiàn)。并且,本發(fā)明是根據(jù)HBase的架構(gòu)特點(diǎn),專門選擇了基于HBase文件存儲中的HFile這一粒度層次來確定索引更新的方法,而放棄了對Data這一粒度的處理方式。本發(fā)明的方