一種基于HBase的大表join方法【專利摘要】本發(fā)明提供一種基于HBase的大表join方法,本發(fā)明針對HBase的大表join問題,借鑒了分布式大數(shù)據(jù)表操作常采用的分桶技術,提出一種基于hashcode預分區(qū)的方法,該方法充分利用了HBase的數(shù)據(jù)存儲特定,高效的解決HBase多表關聯(lián)問題。【專利說明】—種基于HBase的大表join方法【
技術領域:
】[0001]本發(fā)明涉及一種計算機應用【
技術領域:
】,具體地說是一種基于HBase的大表join方法?!?br>背景技術:
】[0002]HBase是一個分布式的、面向列的開源數(shù)據(jù)庫,該技術來源于FayChang所撰寫的Google論文“Bigtable:—個結(jié)構化數(shù)據(jù)的分布式存儲系統(tǒng)”。就像Bigtable利用了Google文件系統(tǒng)(FileSystem)所提供的分布式數(shù)據(jù)存儲一樣,HBase在hdfs之上提供了類似于Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不同于一般的關系數(shù)據(jù)庫,它是一個適合于非結(jié)構化數(shù)據(jù)存儲的數(shù)據(jù)庫。另一個不同的是HBase基于列的而不是基于行的模式。[0003]HadoopDistributedFileSystem(HDFS)被設計成適合運行在通用硬件(commodityhardware)上的分布式文件系統(tǒng)。HDFS是一個高度容錯性的系統(tǒng),適合部署在廉價的機器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應用。[0004]HBase采用基于hdfs的分布式列存儲給它帶來許多優(yōu)勢,首先HBase采用了分布式文件系統(tǒng)使得大數(shù)據(jù)量的存儲成為可能,同時分布式架構支持高并發(fā)的訪問請求;其次HBase的數(shù)據(jù)存儲結(jié)構中每個字段采用數(shù)據(jù)聚集存儲,在查詢時如果只需要返回少數(shù)幾個字段,能大大減少讀取的數(shù)據(jù)量,同時既然是一個字段的數(shù)據(jù)聚集存儲,那就更容易為這種聚集存儲設計更好的壓縮/解壓算法。[0005]原生態(tài)的HBase雖然在大數(shù)據(jù)量上的存取有優(yōu)勢,但是對于兩個大表的join問題并沒有提供很好的解決方法,在HBase中一般采用大表冗余的方法提供關系數(shù)據(jù)庫的join功能,但這種方法容易浪費存儲空間,并且對于用戶來說采用該方法實現(xiàn)join操作時需要在導入時重新設計數(shù)據(jù)表的存儲結(jié)構,對于不了解HBase的使用者顯得過于復雜?!?br/>發(fā)明內(nèi)容】[0006]本發(fā)明的目的是提供一種基于HBase的大表join方法。[0007]本發(fā)明的目的是按以下方式實現(xiàn)的,通過采用提取join相關列的hashcode,并使用該hashcode作為對HBasereg1n預分區(qū)起始范圍的方法解決基于HBase的大表join問題。[0008]本發(fā)明的方法實現(xiàn)包括三個技術點:對表中某列或某幾列采用hashcode分桶;對各表的分桶數(shù)據(jù)進行均衡操作;實現(xiàn)分布式內(nèi)存緩存技術,并重寫HBase中的scan操作使之完成內(nèi)存表和磁盤表的對比返回。[0009]I)分桶是處理大數(shù)據(jù)表常用方法,在hive和其它大數(shù)據(jù)軟件上的應用證明該方法可以大幅提高大數(shù)據(jù)表的join操作效率。[0010]分桶技術是將表數(shù)據(jù)按照某列或某幾列的hashcode區(qū)分開來,然后采用該hashcode作為起始范圍實現(xiàn)reg1n預分區(qū),join操作以reg1n為單位并行進行??梢钥闯霰景l(fā)明利用hbase自身的分區(qū)數(shù)據(jù)存儲結(jié)構reg1n實現(xiàn)表數(shù)據(jù)分桶,這樣在實現(xiàn)分桶的同時可以利用HBase分布式處理數(shù)據(jù)的能力。[0011]2)采用reg1n作為數(shù)據(jù)表中分桶單位,但HBase均衡各個reg1nserver節(jié)點reg1n的數(shù)量不是針對各表的,而是節(jié)點中reg1n的總數(shù)量,這樣就必然導致單表的reg1n在各個節(jié)點分布不均勻的情況出現(xiàn),如圖1所示,圖中綠色、橙色、黃色分別代表三張表在各個節(jié)點中的reg1n,從圖中可以看出表中數(shù)據(jù)在各個節(jié)點中的數(shù)據(jù)分配很不均勻,這樣就必然導致單個節(jié)點計算量過大拖慢整個計算效率。本發(fā)明通過重寫HBase的LoadBalancer策略使得各個的reg1n均勻分布到各個節(jié)點的reg1nserver中去。[0012]3)實現(xiàn)分布式緩存機制,在join操作的過程中需要將其中一張表放入臨時緩存中,以便改寫后的scan函數(shù)可以完成兩張表的對比join操作;分布式緩存機制采取根據(jù)分桶號以reg1n為數(shù)據(jù)單位分布式存儲的緩存機制,該機制可以利用分桶號將兩表對應列存儲到同一節(jié)點。[0013]本發(fā)明的有益效果是:針對HBase的大表join問題,借鑒了分布式大數(shù)據(jù)表操作常采用的分桶技術,提出一種基于hashcode預分區(qū)的方法,該方法充分利用了HBase的數(shù)據(jù)存儲特定,高效的解決HBase多表關聯(lián)問題?!緦@綀D】【附圖說明】[0014]圖1是hbase中reg1n分布圖。【具體實施方式】[0015]參照說明書附圖對本發(fā)明的基于HBase的大表join方法作以下詳細地說明。[0016]本發(fā)明的一種基于HBase的大表join方法,假設我們有表A和表B,并需要在A的a列上和B的b列上完成join操作,實現(xiàn)本發(fā)明方法的過程,步驟如下:1)裝載數(shù)據(jù)首先需要對表A和表B的數(shù)據(jù)進行清理,以便將數(shù)據(jù)裝載如HBase中,具體的裝載步驟如下:創(chuàng)建表A和表B在HBase上對應的數(shù)據(jù)存儲表,表名為H_A和H_B,由于需要根據(jù)HBase的reg1n機制實現(xiàn)分桶功能,所以需要在建表的同時按hashcode對reg1n進行預分區(qū),預分區(qū)的個數(shù)根據(jù)需要可以人為設定,設定reg1n管理數(shù)據(jù)的范圍為startkey、stopkey,該數(shù)的內(nèi)容為分桶編號num+rowkey.length(O)。[0017]將表A和表B的數(shù)據(jù)導入HBase對應的數(shù)據(jù)表H_A和H_B中,在導入之前我們需要根據(jù)要實現(xiàn)的業(yè)務邏輯在表A和表B中選定某列或某幾列作為HBase的rowkey的一部分,同時計算表A和表B需要進行join的列的分桶號,最終將分桶號和所選定的列作為HBase數(shù)據(jù)表H_A、H_B的rowkey。[0018]在計算join列的分桶號時,一般先將該對象的HashCode和0x7FFFFFFF做與操作,因為一個對象的HashCode可以為負數(shù),這樣操作后可以保證它為一個正整數(shù).然后以總共的桶數(shù)取模,得到該對象所屬reg1n的桶數(shù)。[0019]num=(0.hashCode()&0x7FFFFFFF)%buckets.length;2)重寫LoadBalance接口上文提到HBase的reg1n負載是以集群中各個reg1nserver所管理的reg1n數(shù)量為調(diào)節(jié)負載的依據(jù),這樣就有可能導致單個節(jié)點的在join操作中計算量過大,出現(xiàn)所謂的木桶原理現(xiàn)象。本專利改寫HBase中的LoadBalance接口使得reg1n的負載操作是以表為單位進行的,改寫后的LoadBalance接口可以使同一張表的所有reg1n均勻的分布到集群的各個reg1nserver節(jié)點中。[0020]3)join操作在完成數(shù)據(jù)導入和以表為單位的負載均衡以后,我們可以進行join操作,操作的具體步驟如下(如要完成H_AjoinH_B的操作):該過程的步驟如下,首先在每個reg1nserver上實現(xiàn)本地緩存,用來緩存表H_B的reg1n數(shù)據(jù)。[0021]然后將各個reg1nserver中表H_A所屬reg1n的bucketnum取出set(num),參照set(num)中的bucket數(shù)從hdfs上取得表H_B中對應的reg1n,并將這些reg1n中的數(shù)據(jù)存儲到reg1nserver的本地緩存cache中。[0022]最后重寫scan接口,命名為bucketJoinScan,在該類中完成掃描表H_A的數(shù)據(jù)的同時將表H_A的數(shù)據(jù)逐條和緩存中表H_B的數(shù)據(jù)進行對比,如果滿足join條件列相等就將兩數(shù)據(jù)結(jié)合返回到客戶端。[0023]除說明書所述的技術特征外,均為本專業(yè)技術人員的已知技術?!緳嗬蟆?.一種基于HBase的大表join方法,其特征在于內(nèi)容包括1)對表中某列或某幾列采用hashcode分桶;2)對各表的分桶數(shù)據(jù)進行均衡操作;3)實現(xiàn)分布式內(nèi)存緩存技術,并重寫HBase中的scan操作使之完成內(nèi)存表和磁盤表的對比返回,其中:1)對表中某列或某幾列采用hashcode分桶,是將表數(shù)據(jù)按照某列或某幾列的hashcode區(qū)分開來,然后采用該hashcode作為起始范圍實現(xiàn)reg1n預分區(qū),join操作以reg1n為單位并行進行,利用hbase自身的分區(qū)數(shù)據(jù)存儲結(jié)構reg1n實現(xiàn)表數(shù)據(jù)分桶,這樣在實現(xiàn)分桶的同時,利用HBase分布式處理數(shù)據(jù)的能力;2)采用reg1n作為數(shù)據(jù)表中分桶單位,但HBase均衡各個reg1nserver節(jié)點reg1n的數(shù)量不是針對各表的,而是節(jié)點中reg1n的總數(shù)量,這樣就必然導致單表的reg1n在各個節(jié)點分布不均勻的情況出現(xiàn),這樣就必然導致單個節(jié)點計算量過大拖慢整個計算效率,通過重寫HBase的LoadBalancer策略使得各個的reg1n均勻分布到各個節(jié)點的reg1nserver中去;3)實現(xiàn)分布式緩存機制,在join操作的過程中需要將其中一張表放入臨時緩存中,以便改寫后的scan函數(shù)完成兩張表的對比join操作;分布式緩存機制采取根據(jù)分桶號以reg1n為數(shù)據(jù)單位分布式存儲的緩存機制,該機制利用分桶號將兩表對應列存儲到同一節(jié)點。2.根據(jù)權利要求1所述的方法,其特征在于,利用HBase的reg1n數(shù)據(jù)管理結(jié)構和keyvalue的數(shù)據(jù)存儲結(jié)構特點,使得在HBase上快速完成大表的join操作,具體步驟如下:(1)針對HBase數(shù)據(jù)管理單位reg1n的結(jié)構特征,通過提前預分區(qū)技術和重新組織存入HBase中數(shù)據(jù)的rowkey方法,在HBase上實現(xiàn)分桶;(2)針對HBase中的負載均衡機制并不針對單表,造成單個數(shù)據(jù)表的reg1n在各個reg1nserver中分布不均勻,從而在join操作時產(chǎn)生木桶效應,通過重寫HBase的負載均衡機制balance,使得單表的reg1n均勻分布,提高計算效率;(3)在HBase中引入分布式緩存機制,將一張表的數(shù)據(jù)分布緩存在集群的各個reg1nserver節(jié)點的內(nèi)存中;(4)重寫scan接口完成兩張數(shù)據(jù)表的特定列或幾列的對比和返回數(shù)據(jù)的join操作?!疚臋n編號】G06F17/30GK104376047SQ201410584560【公開日】2015年2月25日申請日期:2014年10月28日優(yōu)先權日:2014年10月28日【發(fā)明者】盧軍佐,曹連超,辛國茂,亓開元,趙仁明,房體盈申請人:浪潮電子信息產(chǎn)業(yè)股份有限公司