本申請(qǐng)涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,特別地,涉及一種基于Hbase行健的高性能查詢方法和裝置。
背景技術(shù):
Hadoop數(shù)據(jù)庫(kù)(HBase,Hadoop Database)是一種分布式、可伸縮的非關(guān)系型(NoSQL,Not Only SQL)數(shù)據(jù)庫(kù),它構(gòu)建在Hadoop基礎(chǔ)設(shè)施之上,依托于Hadoop的迅猛發(fā)展,HBase在大數(shù)據(jù)領(lǐng)域的應(yīng)用越來越廣泛,成為目前NoSQL數(shù)據(jù)庫(kù)中表現(xiàn)最耀眼,呼聲最高的產(chǎn)品之一。
HBase的表數(shù)據(jù)按行?。≧owkey)進(jìn)行字典排序, Rowkey實(shí)際上是數(shù)據(jù)表的一級(jí)索引(Primary Index),Rowkey在HBase中以B+ 樹的結(jié)構(gòu)形式有序存儲(chǔ),掃描效率較高,但在面對(duì)多條件組合查詢時(shí),仍存在不便。雖然Hbase提供了一些針對(duì)Rowkey、列、列簇的過濾器(Filter),可以實(shí)現(xiàn)組合、比較等查詢方式,但是多Filter的組合過濾是要在HBase里進(jìn)行多次數(shù)據(jù)掃描,速度緩慢、組合麻煩、效率低下,經(jīng)常無(wú)法滿足查詢要求。
另外,雖然可以借助批處理或者其他方式建立HBase的二級(jí)索引數(shù)據(jù),但是在插入主數(shù)據(jù)時(shí)需要伴隨插入多份二級(jí)索引從而較大程度的降低了寫入性能。對(duì)于一些輕量級(jí)的條件搜索場(chǎng)景,二級(jí)搜索顯得過于浪費(fèi)資源,而且每次創(chuàng)建新的表后,需要重新編寫代碼來支持。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)?zhí)峁┮环N基于Hbase行健的高性能查詢方法和裝置,用于解決現(xiàn)有Hbase無(wú)法在保持高性能優(yōu)勢(shì)的條件下支持多條件查詢的問題。
本申請(qǐng)公開的一種基于Hbase行健的高性能查詢方法,所述行健包括按預(yù)設(shè)結(jié)構(gòu)排列的n個(gè)查詢列的數(shù)據(jù),所述方法包括:接收用戶輸入的m個(gè)對(duì)Hbase表的查詢條件及其邏輯關(guān)系;根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息解析出每個(gè)查詢條件對(duì)應(yīng)的查詢列、查詢條件值及其運(yùn)算符;獲取所述Hbase表中每一行的行健,根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息對(duì)所述行健進(jìn)行分解,得到每個(gè)查詢條件中的對(duì)應(yīng)查詢列的比對(duì)值,將所述比對(duì)值與查詢條件值根據(jù)所述運(yùn)算符進(jìn)行比較運(yùn)算,生成所述查詢條件的比較結(jié)果;以及,根據(jù)所述邏輯關(guān)系匯總所有查詢條件的比較結(jié)果,將匯總后的比較結(jié)果為真的行健對(duì)應(yīng)的行數(shù)據(jù)返回給用戶;其中,n≥m≥1。
本申請(qǐng)公開的一種基于Hbase行健的高性能查詢裝置,包括:元數(shù)據(jù)構(gòu)造模塊,用于預(yù)設(shè)元數(shù)據(jù)表信息以及行健的預(yù)設(shè)結(jié)構(gòu),所述行健包括按預(yù)設(shè)結(jié)構(gòu)排列的n個(gè)查詢列的數(shù)據(jù); 過濾器模塊,用于接收用戶輸入的m個(gè)對(duì)Hbase表的查詢條件及其邏輯關(guān)系;以及,根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息解析出每個(gè)查詢條件對(duì)應(yīng)的查詢列、查詢條件值及其運(yùn)算符;查詢執(zhí)行模塊,用于獲取所述Hbase表每一行數(shù)據(jù)的行健,根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息對(duì)所述行健進(jìn)行分解,得到每個(gè)查詢條件中的對(duì)應(yīng)查詢列的比對(duì)值,將所述比對(duì)值與查詢條件值根據(jù)所述運(yùn)算符進(jìn)行比較運(yùn)算,生成所述查詢條件的比較結(jié)果;以及,根據(jù)所述邏輯關(guān)系匯總所有查詢條件的比較結(jié)果,將匯總后的比較結(jié)果為真的行健對(duì)應(yīng)的行數(shù)據(jù)返回給用戶;其中,n≥m≥1。
與現(xiàn)有技術(shù)相比,本申請(qǐng)具有以下優(yōu)點(diǎn):本申請(qǐng)優(yōu)選實(shí)施例采用非侵入式實(shí)現(xiàn)了基于一級(jí)索引Rowkey的高性能復(fù)雜條件查詢引擎,以HBase的Rowkey一級(jí)索引的優(yōu)勢(shì)為基礎(chǔ),對(duì)掃描過程中獲取的Rowkey與比較器中需要查詢分片的位置、分片的預(yù)期值進(jìn)行字節(jié)(byte)比較,從而能夠在保證高性能的同時(shí)實(shí)現(xiàn)HBase多條件細(xì)粒度的過濾查詢。
附圖說明
附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本申請(qǐng)的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1為本申請(qǐng)基于Hbase行健的高性能查詢方法一實(shí)施例的流程圖;
圖2為本申請(qǐng)Rowkey的結(jié)構(gòu)示意圖;
圖3為本申請(qǐng)基于Hbase行健的高性能查詢裝置一實(shí)施例的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說明。
在本申請(qǐng)的描述中,需要理解的是,術(shù)語(yǔ) “多個(gè)”的含義是兩個(gè)或兩個(gè)以上,除非另有明確具體的限定。術(shù)語(yǔ)“包括”、“包含”及類似術(shù)語(yǔ)應(yīng)該被理解為是開放性的術(shù)語(yǔ),即“包括/包含但不限于”。術(shù)語(yǔ)“基于”是“至少部分地基于”。術(shù)語(yǔ)“一實(shí)施例”表示“至少一個(gè)實(shí)施例”;術(shù)語(yǔ)“另一實(shí)施例”表示“至少一個(gè)另外的實(shí)施例”。其他術(shù)語(yǔ)的相關(guān)定義將在下文描述中給出。
本申請(qǐng)的核心發(fā)明思想之一在于:按照本申請(qǐng)涉及到的規(guī)范,對(duì)HBase表的Rowkey進(jìn)行優(yōu)化設(shè)計(jì),預(yù)設(shè)查詢分片,并生成與表相關(guān)的查詢特性映射信息。編寫Rowkey過濾器的分片查詢比較器,在比較器中通過元數(shù)據(jù)來獲取查詢分片的映射信息,包括偏移位置、分片的長(zhǎng)度、分片的預(yù)期值、分片的操作符,在掃描HBase數(shù)據(jù)的過程中,需要遍歷行健,直接與預(yù)設(shè)好的查詢分片信息來比較byte值,HBase中Rowkey存儲(chǔ)的是字節(jié)數(shù)組,無(wú)需再次轉(zhuǎn)換,直接高效率的進(jìn)行比較,根據(jù)返回的運(yùn)算結(jié)果(是或否),進(jìn)行判斷是否過濾該行數(shù)據(jù)。因此對(duì)于一些基本的搜索功能要求,無(wú)需重新編寫二級(jí)索引代碼,無(wú)需花很長(zhǎng)時(shí)間通過列值進(jìn)行過濾搜索,直接通過Rowkey分片的方式就能輕松快速的完成基本字段搜索功能。
參照?qǐng)D1,示出了本申請(qǐng)基于Hbase行健的高性能查詢方法一實(shí)施例的流程,本優(yōu)選實(shí)施例中的Hbase數(shù)據(jù)表中的Rowkey包括有按預(yù)設(shè)結(jié)構(gòu)排列的n個(gè)查詢列的數(shù)據(jù),并在Hbase中預(yù)設(shè)有元數(shù)據(jù)表的結(jié)構(gòu)。
具體實(shí)施時(shí),元數(shù)據(jù)表結(jié)構(gòu)可以包括Hbase表名、列名、列類型、偏移地址和是否倒序等。Rowkey可以采用如圖2所示的結(jié)構(gòu)形式,即n個(gè)查詢列的數(shù)據(jù)之間以0x00為分隔符隔開。
所述方法具體包括以下步驟:
步驟S101:接收用戶輸入的m個(gè)對(duì)Hbase表的查詢條件及其邏輯關(guān)系。
其中,n≥m≥1。
用戶在進(jìn)行查詢時(shí),輸入內(nèi)容主要包括: Hbase表名,每個(gè)查詢條件的列名、操作符、第一查詢條件值和第二查詢條件值,以及各查詢條件之間的邏輯關(guān)系等。
操作符可以是等于(=)、不等于(≠)、大于(>)、小于(<)、大于等于(≥)、小于等于(≤)、介于第一查詢條件值和第二查詢條件值之間(between)等。邏輯關(guān)系可以是與(and)、或(or)、異或(xor)、非(not)等。
當(dāng)操作符為一元運(yùn)算(如操作符為等于、不等于、大于、小于等)時(shí),只需要第一查詢條件值即可;當(dāng)操作符為二元運(yùn)算(如between)時(shí),需要值第一查詢條件值和第二查詢條件值。
步驟S102:根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息解析出每個(gè)查詢條件對(duì)應(yīng)的查詢列、查詢條件值及其運(yùn)算符。
具體實(shí)施時(shí),用戶輸入的查詢條件可以以分片數(shù)組的形式傳遞,具體包括長(zhǎng)度均為m的列名分片數(shù)組、偏移地址分片數(shù)組、第一條件值分片數(shù)組、第二條件值分片數(shù)組和運(yùn)算符分片數(shù)組。
根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息解析出每個(gè)查詢條件對(duì)應(yīng)的查詢列、查詢條件值,具體可以包括:根據(jù)待查詢Hbase表名和預(yù)設(shè)的元數(shù)據(jù)表獲取所述Hbase表的列名、列類型和偏移地址;根據(jù)所述列名的偏移地址從所述列名分片數(shù)組中分解獲得每個(gè)查詢條件的查詢列的列名;根據(jù)所述查詢列的列名獲得對(duì)應(yīng)的列類型,并根據(jù)列類型計(jì)算對(duì)應(yīng)查詢條件值的偏移地址;根據(jù)所述查詢條件值的偏移地址從所述第一條件值分片數(shù)組和第二條件值分片數(shù)組中分解獲得每個(gè)查詢條件的查詢條件值。
步驟S103:獲取Hbase表中每一行的行健,根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息對(duì)所述行健進(jìn)行分解,得到每個(gè)查詢條件中的對(duì)應(yīng)查詢列的比對(duì)值,將所述比對(duì)值與查詢條件值根據(jù)所述運(yùn)算符進(jìn)行比較運(yùn)算,生成所述查詢條件的比較結(jié)果。
具體實(shí)施時(shí),為提高比對(duì)效率,上述比對(duì)值與查詢條件值根據(jù)所述運(yùn)算符進(jìn)行比較運(yùn)算,具體可以采用字節(jié)(byte)比較方式。
在另一實(shí)施例中,當(dāng)Rowkey采用如圖2所示的結(jié)構(gòu)形式時(shí),所述根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息分解對(duì)所述行健進(jìn)行分解,得到每個(gè)查詢條件對(duì)應(yīng)查詢列的比對(duì)值,具體可以包括:
步驟S103-1:根據(jù)每個(gè)查詢列的列類型獲得相應(yīng)查詢列的字節(jié)長(zhǎng)度Leni;
步驟S103-2:根據(jù)所述查詢條件中對(duì)應(yīng)查詢列在行健中的排列位置k、以及位于該查詢列之前各查詢列的字節(jié)長(zhǎng)度,計(jì)算該第k個(gè)查詢列在行健中的偏移量Offsetk;具體公式如下:
步驟S103-3:從該偏移量Offsetk處讀取長(zhǎng)度為L(zhǎng)enk字節(jié)的數(shù)據(jù),作為該查詢列的比對(duì)值。
步驟S104:根據(jù)所述邏輯關(guān)系匯總所有查詢條件的比較結(jié)果,將匯總后的比較結(jié)果為真的行健對(duì)應(yīng)的行數(shù)據(jù)返回給用戶。
本申請(qǐng)通過上述手段,可以產(chǎn)生如下有益技術(shù)效果:
高性能:一是基于Rowkey一級(jí)索引為過濾條件,二是直接比較字節(jié),無(wú)需在進(jìn)行比較前將數(shù)據(jù)轉(zhuǎn)換為String、long等類型,可顯著降低資源消耗。
輕量級(jí):本申請(qǐng)只是基于Rowkey進(jìn)行過濾,無(wú)需在HBase中插入多份數(shù)據(jù),無(wú)需建立二級(jí)索引,無(wú)需借助第三方組件,可以直接封裝成一個(gè)jar包即可完成輕量級(jí)的多條件過濾功能。
靈活性:根據(jù)查詢參數(shù)、參數(shù)的預(yù)期比較值就可以進(jìn)行準(zhǔn)確快速比較。
高復(fù)用性:只要符合元數(shù)據(jù)構(gòu)造器的規(guī)范即可適用所有HBase的表,無(wú)需重新編寫分片過濾器,即可重復(fù)適用。
簡(jiǎn)易性:通過本方法,大大簡(jiǎn)化開發(fā)應(yīng)用部署過程。
對(duì)于前述的各方法實(shí)施例,為了描述簡(jiǎn)單,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域的技術(shù)人員應(yīng)該知悉,本申請(qǐng)并不受所描述的動(dòng)作順序的限制,因?yàn)楦鶕?jù)本申請(qǐng),某些步驟可以采用其他順序或同時(shí)執(zhí)行;其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,上述方法實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本申請(qǐng)所必須的。
本申請(qǐng)還公開了一種在其上記錄有用于執(zhí)行上述方法的程序的計(jì)算機(jī)可讀記錄介質(zhì)。所述計(jì)算機(jī)可讀記錄介質(zhì)包括配置為以計(jì)算機(jī)(以計(jì)算機(jī)為例)可讀的形式存儲(chǔ)或傳送信息的任何機(jī)制。例如,機(jī)器可讀介質(zhì)包括只讀存儲(chǔ)器(ROM)、隨機(jī)存取存儲(chǔ)器(RAM)、磁盤存儲(chǔ)介質(zhì)、光存儲(chǔ)介質(zhì)、閃速存儲(chǔ)介質(zhì)、電、光、聲或其他形式的傳播信號(hào)(例如,載波、紅外信號(hào)、數(shù)字信號(hào)等)等。
參照?qǐng)D3,示出了本申請(qǐng)基于Hbase行健的高性能查詢裝置一實(shí)施例的結(jié)構(gòu)框圖,包括:
元數(shù)據(jù)構(gòu)造模塊30,用于預(yù)設(shè)元數(shù)據(jù)表信息以及行健的預(yù)設(shè)結(jié)構(gòu),所述行健包括按預(yù)設(shè)結(jié)構(gòu)排列的n個(gè)查詢列的數(shù)據(jù)。
過濾器模塊31,用于接收用戶輸入的m個(gè)對(duì)Hbase表的查詢條件及其邏輯關(guān)系;以及,根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息解析出每個(gè)查詢條件對(duì)應(yīng)的查詢列、查詢條件值及其運(yùn)算符。
其中,n≥m≥1。
查詢執(zhí)行模塊32,用于獲取Hbase表每一行數(shù)據(jù)的行健,根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息對(duì)所述行健進(jìn)行分解,得到每個(gè)查詢條件中的對(duì)應(yīng)查詢列的比對(duì)值,將所述比對(duì)值與查詢條件值根據(jù)所述運(yùn)算符進(jìn)行比較運(yùn)算,生成所述查詢條件的比較結(jié)果;以及,根據(jù)所述邏輯關(guān)系匯總所有查詢條件的比較結(jié)果,將匯總后的比較結(jié)果為真的行健對(duì)應(yīng)的行數(shù)據(jù)返回給用戶。
在另一實(shí)施例中,所述預(yù)設(shè)的元數(shù)據(jù)表可以包括Hbase表名、列名、列類型和偏移地址等;所述行健的預(yù)設(shè)結(jié)構(gòu)可以為:n個(gè)查詢列的數(shù)據(jù)之間以0x00為分隔符隔開。
所述根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息分解對(duì)所述行健進(jìn)行分解,得到每個(gè)查詢條件對(duì)應(yīng)查詢列的比對(duì)值,具體包括:根據(jù)每個(gè)查詢列的列類型獲得相應(yīng)查詢列的字節(jié)長(zhǎng)度Leni;根據(jù)所述查詢條件中的對(duì)應(yīng)查詢列在行健中的排列位置k、以及位于該查詢列之前各查詢列的字節(jié)長(zhǎng)度,計(jì)算該第k個(gè)查詢列在行健中的偏移量Offsetk,然后從該偏移量Offsetk處讀取長(zhǎng)度為L(zhǎng)enk字節(jié)的數(shù)據(jù),作為該查詢列的比對(duì)值。
所述預(yù)設(shè)的元數(shù)據(jù)表可以包括Hbase表名、列名、列類型和偏移地址。所述查詢條件包括列名分片數(shù)組、偏移地址分片數(shù)組、第一條件值分片數(shù)組、第二條件值分片數(shù)組和運(yùn)算符分片數(shù)組,每個(gè)分片數(shù)組的長(zhǎng)度為m。
根據(jù)預(yù)設(shè)的元數(shù)據(jù)表信息解析出每個(gè)查詢條件對(duì)應(yīng)的查詢列、查詢條件值,具體包括:根據(jù)待查詢Hbase表名和預(yù)設(shè)的元數(shù)據(jù)表獲取所述Hbase表的列名、列類型和偏移地址;根據(jù)所述列名的偏移地址從所述列名分片數(shù)組中分解獲得每個(gè)查詢條件的查詢列的列名;根據(jù)所述查詢列的列名獲得對(duì)應(yīng)的列類型,并根據(jù)列類型計(jì)算對(duì)應(yīng)查詢條件值的偏移地址;根據(jù)所述查詢條件值的偏移地址從所述第一條件值分片數(shù)組和第二條件值分片數(shù)組中分解獲得每個(gè)查詢條件的查詢條件值。
需要說明的是,上述裝置實(shí)施例屬于優(yōu)選實(shí)施例,所涉及的單元和模塊并不一定是本申請(qǐng)所必須的。
下面,結(jié)合具體實(shí)例說明過濾器模塊31的工作流程,具體包括:
1、過濾器模塊31收到用戶輸入的多查詢條件分片,根據(jù)元數(shù)據(jù)信息,自動(dòng)映射各查詢條件分片的偏移量、數(shù)據(jù)類型等元數(shù)據(jù)映射信息。
例如:假設(shè)當(dāng)前HBase數(shù)據(jù)集如下表1所示:
表1.HBase數(shù)據(jù)集
注:表1中行健的格式為“用戶編號(hào)+時(shí)間+訂單狀態(tài)+金額”,行健在Hbase中存儲(chǔ)時(shí)為byte類型,表1所示只是為了方便展示。
生成的元數(shù)據(jù)如表2所示:
表2.元數(shù)據(jù)信息
用戶輸入的查詢條件:用戶編號(hào)【>50】 并且 訂單狀態(tài)【不等于過期】
經(jīng)過映射得到結(jié)果,如表3所示:
表3.查詢分片信息
2、構(gòu)造器遍歷映射后的查詢分片信息,解析分片信息,針對(duì)不同條件進(jìn)行不同的操作。
3、HBase在掃描(scan)數(shù)據(jù)的時(shí)候,獲取Rowkey值,與遍歷中的查詢分片進(jìn)行定位,通過運(yùn)算符,直接比較byte值,效率更高效,進(jìn)而判斷出該行鍵是否符合分片要求。
根據(jù)元數(shù)據(jù)信息,將Rowkey進(jìn)行分解,然后根據(jù)元數(shù)據(jù)中用戶標(biāo)號(hào)的偏移量,映射后得到比對(duì)的值,進(jìn)行比較過濾。
4、每行數(shù)據(jù)遍歷完查詢分片后,將匯總比較結(jié)果,如果都true的話,就返回該行給客戶端。
最終輸出結(jié)果如表4所示:
表4.輸出結(jié)果
本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
以上對(duì)本申請(qǐng)所提供的一種基于Hbase行健的高性能查詢方法和裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請(qǐng)的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。