一種基于HBase的Lob數(shù)據(jù)的存儲(chǔ)方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種基于HBase的Lob數(shù)據(jù)的存儲(chǔ)方法及
目.ο
【背景技術(shù)】
[0002]HBase (分布式存儲(chǔ)系統(tǒng))是一個(gè)分布式、面向列的開源數(shù)據(jù)庫(kù),可實(shí)現(xiàn)幾十億、上百億的數(shù)據(jù)存儲(chǔ)。當(dāng)對(duì)處理大對(duì)象(Large Object, LOB)數(shù)據(jù),如文檔、音樂(lè)、視頻等數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí),可能會(huì)存在如下問(wèn)題:
[0003]UHBase在進(jìn)行底層存儲(chǔ)時(shí)是以KeyValue形式進(jìn)行存儲(chǔ)的,當(dāng)客戶端向服務(wù)器端更新數(shù)據(jù)時(shí),服務(wù)器端先把待更新的KeyValue對(duì)象存儲(chǔ)在內(nèi)存(MemStore)中,當(dāng)內(nèi)存中的存儲(chǔ)的KeyValue對(duì)象達(dá)到閾值時(shí),再將該達(dá)到閾值的KeyValue對(duì)象存儲(chǔ)為StoreFiel,因此,如果KeyValue值過(guò)大,容易造成服務(wù)器端內(nèi)存溢出;
[0004]2、HBase表在進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),會(huì)根據(jù)行關(guān)鍵字(RowKey)拆分為多個(gè)分區(qū)(Reg1n),每個(gè)分區(qū)包括多個(gè)HFile文件。而由于Lob數(shù)據(jù)列值很大,所以HFile文件容易超出分區(qū)限制,從而進(jìn)行拆分并形成大量的分區(qū),而每個(gè)分區(qū)只有很少的行,過(guò)多的分區(qū)數(shù)量使得對(duì)HBase表數(shù)據(jù)的掃描(Scan)效率比較低。
[0005]針對(duì)上述問(wèn)題,在客戶端需要存儲(chǔ)Lob數(shù)據(jù)時(shí)往往會(huì)結(jié)合HDFS (分布式文件系統(tǒng))進(jìn)行輔助,客戶端將Lob數(shù)據(jù)存儲(chǔ)到HDFS中,而將其他結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)到HBase中。由于客戶端在針對(duì)Lob數(shù)據(jù)和其他結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)時(shí),需要利用這兩種數(shù)據(jù)庫(kù)(HBase和HDFS)分別進(jìn)行存儲(chǔ),需要客戶端分別針對(duì)每一種數(shù)據(jù)庫(kù)的存儲(chǔ)方式進(jìn)行大量編程處理,因此,該存儲(chǔ)方式實(shí)用性較低。
【發(fā)明內(nèi)容】
[0006]有鑒于此,本發(fā)明提供一種基于HBase的Lob數(shù)據(jù)的存儲(chǔ)方法及裝置,在保證實(shí)用性的前提下實(shí)現(xiàn)大對(duì)象數(shù)據(jù)存儲(chǔ)的問(wèn)題。
[0007]本發(fā)明提供了一種基于HBase的Lob數(shù)據(jù)的存儲(chǔ)方法,根據(jù)HTable對(duì)象擴(kuò)展LobTable對(duì)象;設(shè)置用于識(shí)別Lob數(shù)據(jù)的Qualifier ;設(shè)置HBase所對(duì)應(yīng)的服務(wù)器向HDFS轉(zhuǎn)存數(shù)據(jù)的轉(zhuǎn)存進(jìn)制,還包括:
[0008]客戶端在向LobTable對(duì)象發(fā)送存儲(chǔ)請(qǐng)求時(shí),LobTable在確定所述存儲(chǔ)請(qǐng)求中包括Qualifier時(shí),確定所述存儲(chǔ)請(qǐng)求攜帶Lob數(shù)據(jù),則創(chuàng)建LobPut對(duì)象;
[0009]客戶端將所述存儲(chǔ)請(qǐng)求中攜帶的Lob數(shù)據(jù)寫入LobPut對(duì)象提供的Lob輸出流中;
[0010]LobPut對(duì)象接收寫入了 Lob數(shù)據(jù)的Lob輸出流,并在每次接收到的滿足第一閾值的數(shù)據(jù)塊時(shí),將滿足該第一閾值的數(shù)據(jù)塊生成相應(yīng)的Put對(duì)象,其中,Put對(duì)象包括相應(yīng)數(shù)據(jù)塊在Lob數(shù)據(jù)中的塊號(hào);
[0011]將生成的Put對(duì)象提交至服務(wù)器端,以使服務(wù)器端根據(jù)提交的Put對(duì)象中所包括的塊號(hào)的順序,利用設(shè)置的轉(zhuǎn)存機(jī)制,將各個(gè)Put對(duì)象對(duì)應(yīng)的數(shù)據(jù)塊依次轉(zhuǎn)存至HDFS的Lob文件中。
[0012]優(yōu)選地,
[0013]進(jìn)一步包括:客戶端調(diào)用LobTable對(duì)象向服務(wù)器端提交scan請(qǐng)求,其中,所述查詢請(qǐng)求用于查詢服務(wù)器端的Lob數(shù)據(jù),并接收服務(wù)器端針對(duì)所述查詢請(qǐng)求返回的Result,所述Result包括所述查詢請(qǐng)求所查詢的Lob數(shù)據(jù)的Row Key ;LobTable對(duì)象將所述Result封裝為L(zhǎng)obResult對(duì)象,LobResult對(duì)象根據(jù)所查詢的Lob數(shù)據(jù)的Row Key生成LobGet對(duì)象,以使LobGet對(duì)象根據(jù)所查詢的Lob數(shù)據(jù)所對(duì)應(yīng)的每一塊數(shù)據(jù)塊在Lob數(shù)據(jù)中的起始地址向服務(wù)器端分塊讀取Lob數(shù)據(jù)。
[0014]本發(fā)明還提供了一種基于HBase的大對(duì)象數(shù)據(jù)的存儲(chǔ)方法,創(chuàng)建LobCorprocessor,設(shè)置HBase所對(duì)應(yīng)的服務(wù)器向HDFS轉(zhuǎn)存數(shù)據(jù)的轉(zhuǎn)存進(jìn)制,還包括:
[0015]服務(wù)器端利用Lob Corprocessor分塊接收客戶端分塊提交的各個(gè)Put對(duì)象,其中,每個(gè)Put對(duì)象包括相應(yīng)數(shù)據(jù)塊在其對(duì)應(yīng)Lob數(shù)據(jù)中的塊號(hào);
[0016]根據(jù)首次接收到的Put對(duì)象所對(duì)應(yīng)數(shù)據(jù)塊,確定HDFS系統(tǒng)的Lob文件中當(dāng)前是否包括與該數(shù)據(jù)塊相關(guān)的數(shù)據(jù),若是,利用設(shè)置的轉(zhuǎn)存機(jī)制將首次接收到的Put對(duì)象所對(duì)應(yīng)的數(shù)據(jù)塊,對(duì)與其相關(guān)的數(shù)據(jù)進(jìn)行更新;若否,利用設(shè)置的轉(zhuǎn)存機(jī)制,將首次接收到的Put對(duì)象所對(duì)應(yīng)的數(shù)據(jù)塊,創(chuàng)建至Lob文件中;
[0017]并根據(jù)提交的Put對(duì)象中所包括的塊號(hào)的順序,利用設(shè)置的轉(zhuǎn)存機(jī)制,將后續(xù)接收到的Put對(duì)象分別對(duì)應(yīng)的數(shù)據(jù)塊轉(zhuǎn)存入Lob文件中,并根據(jù)每個(gè)數(shù)據(jù)塊的塊號(hào)將各個(gè)數(shù)據(jù)塊組合為L(zhǎng)ob數(shù)據(jù)。
[0018]優(yōu)選地,進(jìn)一步包括:通過(guò)調(diào)用PrePut對(duì)象拋出一個(gè)特定的Do Not Retry1Except1n的子類異常,以阻止Lob Corprocessor將各個(gè)Put對(duì)象所對(duì)應(yīng)的數(shù)據(jù)塊寫入到HBase的操作。
[0019]優(yōu)選地,
[0020]進(jìn)一步包括:創(chuàng)建讀取數(shù)據(jù)的LobScanner對(duì)象;
[0021]進(jìn)一步包括:接收客戶端通過(guò)LobGet提交的Get對(duì)象,所述Get對(duì)象中包括所查詢的 Lob 數(shù)據(jù)的 Row Key ;Lob Corprocessor 打開 LobScanner 對(duì)象;LobScanner 對(duì)象根據(jù)所述Get對(duì)象中的Row Key確定所查詢的Lob數(shù)據(jù)的存儲(chǔ)位置,并在確定的存儲(chǔ)位置中分塊讀取Lob數(shù)據(jù)的各個(gè)數(shù)據(jù)塊,并將各個(gè)數(shù)據(jù)塊轉(zhuǎn)換為KeyValue形式,使得服務(wù)器端將該KeyValue形式的各個(gè)數(shù)據(jù)塊返回給客戶端;
[0022]或,
[0023]進(jìn)一步包括:LobStore進(jìn)一步以HFile文件的形式和MemStore形式存儲(chǔ)Lob數(shù)據(jù);
[0024]進(jìn)一步包括:遍歷HDFS中的Lob文件,并將遍歷到的小于第二閾值的多個(gè)Lob數(shù)據(jù)合并到HFile文件中;
[0025]進(jìn)一步包括:將合并為HFile文件的多個(gè)Lob數(shù)據(jù)的刪除信息存儲(chǔ)至MemStore中。
[0026]本發(fā)明還提供了一種客戶端,包括:
[0027]擴(kuò)展單元,用于根據(jù)HTable對(duì)象擴(kuò)展LobTable對(duì)象;設(shè)置用于識(shí)別Lob數(shù)據(jù)的Qualifier ;
[0028]處理單元,用于在向LobTable對(duì)象發(fā)送存儲(chǔ)請(qǐng)求時(shí),LobTable在確定所述存儲(chǔ)請(qǐng)求中包括Qualifier時(shí),確定所述存儲(chǔ)請(qǐng)求攜帶Lob數(shù)據(jù),則創(chuàng)建LobPut對(duì)象;
[0029]寫入單元,用于將所述存儲(chǔ)請(qǐng)求中攜帶的Lob數(shù)據(jù)寫入LobPut對(duì)象提供的Lob輸出流中;
[0030]接收單元,用于利用LobPut對(duì)象接收寫入了 Lob數(shù)據(jù)的Lob輸出流,并在每次接收到的滿足第一閾值的數(shù)據(jù)塊時(shí),將滿足該第一閾值的數(shù)據(jù)塊生成相應(yīng)的Put對(duì)象,其中,Put對(duì)象包括相應(yīng)數(shù)據(jù)塊在Lob數(shù)據(jù)中的塊號(hào);
[0031]提交單元,用于將生成的Put對(duì)象提交至服務(wù)器端,以使服務(wù)器端根據(jù)預(yù)先設(shè)置的HBase所對(duì)應(yīng)的服務(wù)器向HDFS轉(zhuǎn)存數(shù)據(jù)的轉(zhuǎn)存進(jìn)制,以及根據(jù)提交的Put對(duì)象中所包括的塊號(hào)的順序,將各個(gè)Put對(duì)象對(duì)應(yīng)的數(shù)據(jù)塊依次轉(zhuǎn)存至HDFS的Lob文件中。
[0032]優(yōu)選地,
[0033]進(jìn)一步包括:數(shù)據(jù)查詢單元,用于調(diào)用LobTable對(duì)象向服務(wù)器端提交查詢請(qǐng)求,其中,所述查詢請(qǐng)求用于查詢服務(wù)器端的Lob數(shù)據(jù),并接收服務(wù)器端針對(duì)所述查詢請(qǐng)求返回的Result,所述Result包括所述查詢請(qǐng)求所查詢的Lob數(shù)據(jù)的Row Key ;LobTabIe對(duì)象將所述Result封裝為L(zhǎng)obResult對(duì)象,LobResult對(duì)象根據(jù)所查詢的Lob數(shù)據(jù)的Row Key生成LobGet對(duì)象,以使LobGet對(duì)象根據(jù)所查詢的Lob數(shù)據(jù)所對(duì)應(yīng)的每一塊數(shù)據(jù)塊在Lob數(shù)據(jù)中的起始地址向服務(wù)器端分塊讀取Lob數(shù)據(jù)。
[0034]本發(fā)明還提供了一種服務(wù)器,包括:
[0035]存儲(chǔ)單元,用于創(chuàng)建Lob Corprocessor,設(shè)置HBase所對(duì)應(yīng)的服務(wù)器向HDFS轉(zhuǎn)存數(shù)據(jù)的轉(zhuǎn)存進(jìn)制;
[0036]接收單元,用于利用Lob Corprocessor分塊接收客戶端分塊提交的各個(gè)Put對(duì)象,其中,每個(gè)Put對(duì)象包括相應(yīng)數(shù)據(jù)塊在其對(duì)應(yīng)Lob數(shù)據(jù)中的塊號(hào);
[0037]處理單元,用于根據(jù)首次接收到的Put對(duì)象所對(duì)應(yīng)數(shù)據(jù)塊,確定HDFS系統(tǒng)的Lob文件中當(dāng)前是否包括與該數(shù)據(jù)塊相關(guān)的數(shù)據(jù),若是,利用設(shè)置的轉(zhuǎn)存機(jī)制將首次接收到的Put對(duì)象所對(duì)應(yīng)的數(shù)據(jù)塊,對(duì)與其相關(guān)的數(shù)據(jù)進(jìn)行更新;若否,利用設(shè)置的轉(zhuǎn)存機(jī)制,將首次接收到的Put對(duì)象所對(duì)應(yīng)的數(shù)據(jù)塊,創(chuàng)建至Lob文件中;
[0038]轉(zhuǎn)存單元,用于根據(jù)提交的Put對(duì)象中所包括的塊號(hào)的順序,利用設(shè)置的轉(zhuǎn)存機(jī)制,將后續(xù)接收到的Put對(duì)象分別對(duì)應(yīng)的數(shù)據(jù)塊轉(zhuǎn)存入Lob文件中,并根據(jù)每個(gè)數(shù)據(jù)塊的塊號(hào)將各個(gè)數(shù)據(jù)塊組合為L(zhǎng)ob數(shù)據(jù)。
[0039]優(yōu)選地,
[0040]進(jìn)一步包括:阻止單元,用于通過(guò)調(diào)用PrePut對(duì)象拋出一個(gè)特定的DoNot Retry1 Except1n的子類異常,以阻止Lob Corprocessor將各個(gè)Put對(duì)象所對(duì)應(yīng)的數(shù)據(jù)塊寫入到HBase的操作。
[0041]優(yōu)選地,
[0042]所述存儲(chǔ)單元,用于創(chuàng)建讀取數(shù)據(jù)的LobScanner對(duì)象;
[0043]進(jìn)一步包括:查詢單元,用于接收客戶端通過(guò)LobGet提交的Get對(duì)象,所述Get對(duì)象中包括所查詢的Lob數(shù)據(jù)的Row Key ;Lob Corprocessor打開LobScanner對(duì)象;LobScanner對(duì)象根據(jù)所述Get對(duì)象中的Row Key確定所查詢的Lob數(shù)據(jù)的存儲(chǔ)位置,并在確定的存儲(chǔ)位置中分塊讀取Lob數(shù)據(jù)的各個(gè)數(shù)據(jù)塊,并將各個(gè)數(shù)據(jù)塊轉(zhuǎn)換為KeyValue形式,使得服務(wù)器端將該KeyValue形式的各個(gè)數(shù)據(jù)塊返回給客戶端;
[0044]或,
[0045]