一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的工具和方法
【專利摘要】本發(fā)明公開了一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的工具和方法,包括解析器、表模式轉(zhuǎn)換器、表模式適配器和數(shù)據(jù)表管理器,所述解析器用于解析由外部工具從傳統(tǒng)關(guān)系數(shù)據(jù)庫導(dǎo)出的表模式定義文檔;所述表模式轉(zhuǎn)換器用于把傳統(tǒng)關(guān)系數(shù)據(jù)庫中的表模式定義轉(zhuǎn)換成HBase數(shù)據(jù)庫中的表模式,支持前文中所提到的四種表變換的方式;所述表模式適配器用于保存、讀取已經(jīng)由表模式轉(zhuǎn)換器所轉(zhuǎn)換過的表模式定義到指定的文件中,并為其它模塊查找新的表模式定義提供接口;所述數(shù)據(jù)表管理器用于把存儲(chǔ)在傳統(tǒng)關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)遷移到HBase數(shù)據(jù)庫中對(duì)應(yīng)新定義的表中。采用本發(fā)明可有效地提高遷移后數(shù)據(jù)庫中針對(duì)表與表之間進(jìn)行連接查詢的性能。
【專利說明】一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的工具和方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)庫領(lǐng)域,尤其涉及的是一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的 工具和方法。
【背景技術(shù)】
[0002] 隨著二十世紀(jì)網(wǎng)絡(luò)帶寬的提升以及互聯(lián)網(wǎng)在全世界范圍內(nèi)的進(jìn)一步普及,以 Facebook、Twitter為代表的SNS社交應(yīng)用平臺(tái)和以淘寶、亞馬遜為代表的電子商務(wù)類互 聯(lián)網(wǎng)應(yīng)用的不斷出現(xiàn),標(biāo)志著我們已經(jīng)進(jìn)入Web2.0時(shí)代。從開發(fā)者的角度而言,復(fù)雜的 Web2. 0應(yīng)用意味著對(duì)應(yīng)用本身的架構(gòu)合理性、健壯性以及性能方面提出了更高的要求,如 何在海量數(shù)據(jù)、高并發(fā)訪問的情況下讓數(shù)據(jù)庫能夠提供穩(wěn)定、可靠的性能是當(dāng)前Web2. 0應(yīng) 用所要解決的重要問題之一。在無數(shù)的開發(fā)和研究之中,人們發(fā)現(xiàn)即使技術(shù)已經(jīng)相當(dāng)成熟 的傳統(tǒng)關(guān)系型數(shù)據(jù)庫也已經(jīng)很難解決這個(gè)問題,越來越多的開發(fā)人員已經(jīng)試圖拋開傳統(tǒng)的 關(guān)系型數(shù)據(jù)庫轉(zhuǎn)而從別的方向探索解決問題的方法。
[0003] 在這樣的技術(shù)研發(fā)背景下,N0SQL數(shù)據(jù)庫便應(yīng)運(yùn)而生了。N0SQL是對(duì)非關(guān)系型數(shù) 據(jù)庫的這一類數(shù)據(jù)庫的統(tǒng)稱,其成員眾多,諸如Cassandra以及MongoDB等輕量級(jí)的N0SQL 數(shù)據(jù)庫已經(jīng)被廣泛地運(yùn)用于Web應(yīng)用中,然而,隨著HBase數(shù)據(jù)庫被Facebook成功地用于 構(gòu)建實(shí)時(shí)系統(tǒng),其已經(jīng)成為目前最熱門的N0SQL數(shù)據(jù)庫。HBase是Hadoop項(xiàng)目所屬的子項(xiàng) 目,是Hadoop上的一個(gè)N0SQL數(shù)據(jù)庫的實(shí)現(xiàn),同時(shí)也是一個(gè)分布式的、面向列的開源數(shù)據(jù) 庫??梢哉f,HBase不僅擁有大部分N0SQL數(shù)據(jù)庫所擁有的優(yōu)點(diǎn),而且由于能與Hadoop無 縫集成,所以它提供了更為強(qiáng)大的可擴(kuò)展性以及數(shù)據(jù)操作性能。當(dāng)前,F(xiàn)acebooKYahoo !、 淘寶、eBay等這些頂級(jí)的Web服務(wù)供應(yīng)商已經(jīng)使用Hadoop成功部署了多個(gè)系統(tǒng)應(yīng)用,在單 個(gè)集群中所能成功部署的計(jì)算機(jī)節(jié)點(diǎn)已經(jīng)多達(dá)4000臺(tái)。
[0004] 由于HBase數(shù)據(jù)庫存在的巨大優(yōu)勢(shì),越來越多的Web應(yīng)用都開始嘗試在其之上重 新構(gòu)建數(shù)據(jù)中心,如何將原先存儲(chǔ)在普通關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)遷移到HBase中成為了當(dāng) 前非常熱門的問題。由于HBase中的表結(jié)構(gòu)具有稀疏的特性,其結(jié)構(gòu)同傳統(tǒng)的關(guān)系型數(shù)據(jù) 庫有著很大的差異,因此在為應(yīng)用程序設(shè)計(jì)數(shù)據(jù)庫中所有表的結(jié)構(gòu)和關(guān)系時(shí)也有許多不同 之處,開發(fā)人員需要手工地重新設(shè)計(jì)HBase數(shù)據(jù)庫中的表模式。然而,這個(gè)過程往往需要花 費(fèi)開發(fā)人員大量的時(shí)間和精力,而且當(dāng)每次遷移新的數(shù)據(jù)庫時(shí),他們又不得不重復(fù)這些過 程,因而浪費(fèi)了許多功夫在這些重復(fù)性的工作上。
[0005] 在2009年Apache開源社區(qū)發(fā)布的數(shù)據(jù)遷移工具Sqoop稍微減輕了開發(fā)人員的工 作負(fù)擔(dān)。Sqoop的主要作用是在結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)與Hadoop/HBase之間進(jìn)行數(shù)據(jù)交換。但 是Sqoop只能夠在兩類數(shù)據(jù)庫中復(fù)制數(shù)據(jù),只是完成了數(shù)據(jù)的遷移工作,并不能將數(shù)據(jù)庫 中的表模式也遷移到HBase中,然而表模式的遷移往往是整個(gè)遷移過程中最耗費(fèi)時(shí)間和精 力的,因而Sqoop所做的工作也有著很大的局限性。
[0006] 而傳統(tǒng)的開源ETL工具Kettle最近也加入了對(duì)HBase的支持。Kettle允許用戶 管理來自不同數(shù)據(jù)庫的數(shù)據(jù),通過提供一個(gè)圖形化的用戶環(huán)境來完成整個(gè)數(shù)據(jù)庫移植的過 程,因而有著良好的用戶體驗(yàn)。但是,用其將關(guān)系數(shù)據(jù)庫移植到HBase仍是相對(duì)繁瑣的。在 這個(gè)過程中,用戶需要手動(dòng)指定表與表之間以及數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系。其次,在轉(zhuǎn)換過程中 并沒有考慮HBase靈活的表結(jié)構(gòu)而只是將原有的表模式未經(jīng)任何變換就復(fù)制過去,這樣不 僅沒有利用到HBase的特性而且在以后數(shù)據(jù)查詢的時(shí)候也會(huì)帶來性能上的下降。因此,現(xiàn) 有技術(shù)還有待于改進(jìn)和發(fā)展。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明的目的在于提供一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的工具和方法,旨 在解決現(xiàn)有的HBase數(shù)據(jù)庫的數(shù)據(jù)遷移方法需要花費(fèi)開發(fā)人員大量的時(shí)間和精力的問題。
[0008] 本發(fā)明的技術(shù)方案如下:
[0009] -種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的工具,其包括解析器、表模式轉(zhuǎn)換器、表 模式適配器和數(shù)據(jù)表管理器,所述解析器用于解析由外部工具從傳統(tǒng)關(guān)系數(shù)據(jù)庫導(dǎo)出的表 模式定義文檔;所述表模式轉(zhuǎn)換器用于把傳統(tǒng)關(guān)系數(shù)據(jù)庫中的表模式定義轉(zhuǎn)換成HBase數(shù) 據(jù)庫中的表模式,支持前文中所提到的四種表變換的方式;所述表模式適配器用于保存、 讀取已經(jīng)由表模式轉(zhuǎn)換器所轉(zhuǎn)換過的表模式定義到指定的文件中,并為其它模塊查找新的 表模式定義提供接口;所述數(shù)據(jù)表管理器用于把存儲(chǔ)在傳統(tǒng)關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)遷移到 HBase數(shù)據(jù)庫中對(duì)應(yīng)新定義的表中。
[0010] 一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其具體包括:在進(jìn)行遷移前需對(duì) 關(guān)系型數(shù)據(jù)庫的表模式進(jìn)行BCNF分解;預(yù)處理后對(duì)關(guān)系型數(shù)據(jù)庫的表模式進(jìn)行變換包括 基本變換、內(nèi)嵌變換、分割變換或內(nèi)聯(lián)變換得到符合HBase數(shù)據(jù)庫定義的表模式;然后將關(guān) 系型數(shù)據(jù)庫的表中的數(shù)據(jù)讀取并轉(zhuǎn)存到Base數(shù)據(jù)庫中對(duì)應(yīng)新定義的表,
[0011] 所述BCNF分解用于消去非主屬性對(duì)鍵的部分函數(shù)依賴、非主屬性對(duì)鍵的傳遞函 數(shù)依賴以及主屬性對(duì)鍵的傳遞函數(shù)依賴;
[0012] 所述基本變換適用于把以關(guān)系數(shù)據(jù)庫中表設(shè)計(jì)模式定義的表變換成HBase中的 表;
[0013] 所述內(nèi)嵌變換用于當(dāng)從表A到表B存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系時(shí),把表B 作為表A的內(nèi)嵌表;
[0014] 所述分割變換用于當(dāng)從表C到其余多個(gè)表之間都存在一對(duì)一、一對(duì)多或多對(duì)多的 關(guān)系時(shí),把表C進(jìn)行分割,按照數(shù)據(jù)的映射關(guān)系,把表C中的每一行內(nèi)嵌到對(duì)應(yīng)的表中;
[0015] 所述內(nèi)聯(lián)變換用于當(dāng)從表A到表B存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系,并且從表 B到表C也存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系時(shí),把表C作為表A的內(nèi)聯(lián)表;
[0016] 其中,表C為表B的從屬關(guān)聯(lián)關(guān)系表,表B為表A的從屬關(guān)聯(lián)關(guān)系表。
[0017] 所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其中,所述基本變換具體變換 方法為:把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名,表A也添加到這個(gè)表的列族中; 之后把表A的主鍵作為對(duì)應(yīng)表的行鍵;最后把表A中定義的所有屬性添加到對(duì)應(yīng)表的列族 1之中。
[0018] 所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其中,所述內(nèi)嵌變換具體變換 方法為:把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名;之后把表A和表B都添加到這個(gè) 表的列族中;接著把表A的王鍵作為對(duì)應(yīng)表的彳丁鍵;隨后把表A中定乂的所有屬性添加到 對(duì)應(yīng)表的列族1之中,把表B中所有同表A這一行有關(guān)的所有行屬性都放入到列族2之中, 最后,刪除表B。
[0019] 所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其中,所述分割變換具體變換 方法為:把表A和表B的表名分別作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名;之后把表A和表B分 別添加到對(duì)應(yīng)表的列族中,把表C都添加到這些表的列族之中;接著把表A和表B的主鍵分 別作為對(duì)應(yīng)表的行鍵;隨后把表A和表B中定義的所有屬性添加到對(duì)應(yīng)表的列族1之中,把 表C中所有同表A或表B這一行有關(guān)的所有行屬性都分別放入到對(duì)應(yīng)表的列族2之中;最 后刪除表C。
[0020] 所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其中,所述內(nèi)聯(lián)變換具體變換 方法為:把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名;之后把表A和表C都添加到這個(gè) 表的列族中;接著把表A的王鍵作為對(duì)應(yīng)表的彳丁鍵;隨后把表A中定乂的所有屬性添加到 對(duì)應(yīng)表的列族1之中,把表C中所有同表A這一行通過表B有間接關(guān)聯(lián)的所有行屬性都放 入到列族2之中;最后刪除表C。
[0021] 所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其中,總的遷移過程采用如下 的決策為:先判斷集合X是否為空,否則取出一個(gè)元素 X,對(duì)其做基本變換,將結(jié)果元素 y放 入集合Y,是則直接得到集合Y ;然后判斷元素 y在集合Y中是否與其他元素存在一對(duì)多、多 對(duì)多的關(guān)系,是則取出一個(gè)關(guān)系映射c,并對(duì)關(guān)系映射c做內(nèi)嵌、分割變換;否則進(jìn)一步判斷 元素 y在集合Y中是否需要做內(nèi)聯(lián)變換,如果否則返回判斷集合X是否為空,若是則做內(nèi)聯(lián) 變換。
[0022] 所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其中,對(duì)所有的表模式進(jìn)行如 下的簡化處理:為每張表指定一個(gè)自增的主鍵;為表的每個(gè)屬性設(shè)置一個(gè)默認(rèn)值;減少表 名稱和屬性名的長度。
[0023] 本發(fā)明的有益效果:本發(fā)明通過分析了 HBase表結(jié)構(gòu)的特點(diǎn)之后,提出了一種基 于關(guān)系型數(shù)據(jù)中表模式結(jié)構(gòu)進(jìn)行相對(duì)于HBase數(shù)據(jù)庫中表模式變換的方法,該方法相對(duì)于 傳統(tǒng)的方法可以有效地提高遷移后數(shù)據(jù)庫中針對(duì)表與表之間進(jìn)行連接查詢的性能。根據(jù)四 種表模式變換實(shí)現(xiàn)了一個(gè)半自動(dòng)化的由關(guān)系型數(shù)據(jù)庫到HBase數(shù)據(jù)庫遷移工具,具體解決 了數(shù)據(jù)類型轉(zhuǎn)換、決策流程等問題。并且,通過一個(gè)遷移實(shí)例證明了該工具可以有效對(duì)SQL Server數(shù)據(jù)庫至HBase數(shù)據(jù)庫進(jìn)行數(shù)據(jù)遷移,得到了很好的連接查詢性能,還比普通工具 在一定程度上減少了數(shù)據(jù)庫所占用的磁盤存儲(chǔ)空間。該半自動(dòng)化工具來幫助開發(fā)人員從這 些重復(fù)的遷移過程中解放出來,是非常有意義的,這不僅能簡化數(shù)據(jù)庫遷移的過程,還能大 大減少應(yīng)用的開發(fā)時(shí)間,減低成本。
【專利附圖】
【附圖說明】
[0024] 圖1是本發(fā)明中提供的對(duì)表模式做基本變換的示意圖。
[0025] 圖2是本發(fā)明中提供的對(duì)表模式做內(nèi)嵌變換的示意圖。
[0026] 圖3是本發(fā)明中提供的對(duì)表模式做分割變換的示意圖。
[0027] 圖4是本發(fā)明中提供的對(duì)表模式做內(nèi)聯(lián)變換的示意圖。
[0028] 圖5是本發(fā)明中提供的對(duì)表進(jìn)行何種變換的選擇流程圖。
[0029] 圖6是本發(fā)明中提供的系統(tǒng)的模塊框圖。
[0030] 圖7是使用不同方法在連接查詢性能方面的效果數(shù)據(jù)比較圖。
[0031] 圖8是使用不同方法在空間存儲(chǔ)量方面的效果數(shù)據(jù)比較圖。
【具體實(shí)施方式】
[0032] 為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚、明確,以下參照附圖并舉實(shí)施例對(duì) 本發(fā)明進(jìn)一步詳細(xì)說明。
[0033] HBase數(shù)據(jù)庫有著這樣幾個(gè)特點(diǎn):單元格是有版本的,數(shù)據(jù)行是有序的,只要列族 存在,列便可以由客戶端隨時(shí)添加。除了以上所述的這三個(gè)特性以外,其實(shí)HBase的表和 RDBMS的表是類似的。但是,在為其設(shè)計(jì)模式時(shí),需要考慮這些不同點(diǎn),并且在對(duì)HBase這 樣的面向列的存儲(chǔ)設(shè)計(jì)模式時(shí),可以利用其可以以極小的開銷管理較寬的稀疏表的這個(gè)同 RDBMS數(shù)據(jù)庫最大的不同點(diǎn)。
[0034] 在HBase中查詢數(shù)據(jù)時(shí),根據(jù)請(qǐng)求數(shù)據(jù)的不同會(huì)出現(xiàn)以下三種情況:
[0035] 1、全表掃描,這種查詢一般是用于取得一張表中所包含的所有數(shù)據(jù),由于需要對(duì) 整張表進(jìn)行掃描,所以花費(fèi)的時(shí)間最長效率也最差。但是由于HBase是采用將表劃分成多 個(gè)區(qū)域的方式組織數(shù)據(jù)的,每個(gè)區(qū)域會(huì)分布在不同的從屬機(jī)節(jié)點(diǎn)上,所以同RDBMS上的全 表掃描相比,HBase能夠把對(duì)整張表格的查詢壓力平均地分布到每個(gè)表格區(qū)域所在的從屬 機(jī)節(jié)點(diǎn)上,這樣能夠在同等數(shù)據(jù)量的情況下取得更好的性能。
[0036] 2、區(qū)間掃描,這種查詢是用于取得一張表中某段行鍵連續(xù)的區(qū)間中的數(shù)據(jù),由于 指定了查詢所需的起始行鍵以及結(jié)束行鍵,所以通過HBase本身內(nèi)部的查詢機(jī)制能夠很 快的定位到所要查找的數(shù)據(jù)所在表的一個(gè)或多個(gè)區(qū)域,因而有著相對(duì)較高的查詢速度,是 HBase數(shù)據(jù)庫推薦的數(shù)據(jù)查詢方式之一。
[0037] 3、行鍵掃描,這種查詢是用于根據(jù)所給的鍵值取得一張表中的行鍵對(duì)應(yīng)的單條數(shù) 據(jù),是所有查詢方法中最快的查詢方式。因?yàn)橥ㄟ^給定的行鍵的值HBase能夠很快的從根 目錄表中很快地得到這一行所在的表區(qū)域,從而直接和表區(qū)域所在的從屬機(jī)節(jié)點(diǎn)進(jìn)行通信 來取得所需要的數(shù)據(jù),而且由于所要取得的是單行數(shù)據(jù),結(jié)果所包含的數(shù)據(jù)集本身就是所 有掃描類型里最少的,因而是性能最好、返回結(jié)果最快的掃描方式。
[0038] 由此可見,并不是所有的查詢方式在HBase數(shù)據(jù)庫中都能得到良好的性能,所以 在設(shè)計(jì)表的結(jié)構(gòu)時(shí)需要使得盡量多的數(shù)據(jù)查詢方式能夠利用到HBase中相對(duì)性能較優(yōu)的 掃描方式,如行鍵掃描或區(qū)間掃描,以此在最大程度上減少數(shù)據(jù)查詢所花費(fèi)的時(shí)間。
[0039] 根據(jù)上述分析本發(fā)明提供的一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,在進(jìn) 行遷移前要對(duì)準(zhǔn)備遷移的表模式進(jìn)行預(yù)處理,先依照傳統(tǒng)關(guān)系型數(shù)據(jù)庫的設(shè)計(jì)方法對(duì)所有 表進(jìn)行初步設(shè)計(jì),減少表與表之間數(shù)據(jù)的冗余以及依賴關(guān)系。
[0040] 首先,需要對(duì)表模式進(jìn)行BCNF分解(Boyce - Codd normal form normalization), 通過BCNF分解,能夠消去非主屬性對(duì)鍵的部分函數(shù)依賴、非主屬性對(duì)鍵的傳遞函數(shù)依賴以 及主屬性對(duì)鍵的傳遞函數(shù)依賴。這樣,表與表之間的依賴關(guān)系就變得非常清晰,利于下一步 的變換處理。
[0041] 另外,為了提高經(jīng)變換后在HBase中產(chǎn)生的數(shù)據(jù)表的查詢性能,對(duì)所有的表模式 還需做如下的簡化:1、為每張表指定一個(gè)自增的主鍵;2、為表的每個(gè)屬性設(shè)置一個(gè)默認(rèn) 值;3、盡量減少表名稱和屬性名的長度。
[0042] 經(jīng)過預(yù)處理之后的表模式就可以遷移到HBase數(shù)據(jù)庫中了,但為了對(duì)連接查詢做 進(jìn)一步的優(yōu)化而獲得更好的性能,還需要對(duì)表進(jìn)行如下的變換:基本變換,內(nèi)嵌變換,分割 變換或內(nèi)聯(lián)變換。
[0043] 所述基本變換適用于把以傳統(tǒng)關(guān)系數(shù)據(jù)庫中表設(shè)計(jì)模式定義的表變換成HBase 中的表。整個(gè)模式設(shè)計(jì)的第一步就是把所有以傳統(tǒng)關(guān)系數(shù)據(jù)庫中表設(shè)計(jì)模式定義的表用基 礎(chǔ)變換的方式變換為符合HBase數(shù)據(jù)庫模式的表,從而得到所有表在HBase中的對(duì)應(yīng)表集 合。
[0044] 具體變換方法為:如圖1所示,令Goods表為表A,把表A的表名作為HBase數(shù)據(jù) 庫中對(duì)應(yīng)表的表名,表A也添加到這個(gè)表的列族中。之后把表A的主鍵作為對(duì)應(yīng)表的行鍵, 最后把表A中定義的所有屬性添加到對(duì)應(yīng)表的列族1之中。
[0045] 該變換將表直接復(fù)制到HBase對(duì)應(yīng)的數(shù)據(jù)庫中。因而,在空間效率及查詢效率上 都同普通的HBase數(shù)據(jù)庫中的表性能一樣。
[0046] 所述內(nèi)嵌變換的適用場(chǎng)景為當(dāng)從表A到表B存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系 時(shí),可以把表B作為表A的內(nèi)嵌表。經(jīng)過這樣的變換,當(dāng)查詢表A中的某一行時(shí)就能夠得到 同這一行所關(guān)聯(lián)的所有表B中的數(shù)據(jù),這樣就可以避免表A和表B之間的連接查詢。當(dāng)對(duì) 表B中的數(shù)據(jù)查詢方式有且僅有通過和表A連接查詢所得時(shí),就可以把表B從由基礎(chǔ)變換 所得到的表集合中刪除。
[0047] 具體變換方法為:如圖2所示,令Goods表為表A、Color表為表B,把表A的表名 作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名,之后把表A和表B都添加到這個(gè)表的列族中。接著把 表A的主鍵作為對(duì)應(yīng)表的行鍵,隨后把表A中定義的所有屬性添加到對(duì)應(yīng)表的列族1之中, 把表B中所有同表A這一行有關(guān)的所有行屬性都放入到列族2之中。最后,根據(jù)情況刪除 表B。
[0048] 該變換將子表內(nèi)嵌到HBase對(duì)應(yīng)的數(shù)據(jù)庫中的主表。由于在變換過程中對(duì)子表進(jìn) 行了一定程度的冗余存儲(chǔ),因而會(huì)消耗稍多的存儲(chǔ)空間,但是提高了由主表到子表的連接 查詢的效率。
[0049] 所述分割變換的適用場(chǎng)景為當(dāng)從表C到其余多個(gè)表之間都存在一對(duì)一、一對(duì)多或 多對(duì)多的關(guān)系時(shí)(在上圖中以表A和表B表示),可以把表C進(jìn)行分割,按照數(shù)據(jù)的映射關(guān) 系,把表C中的每一行內(nèi)嵌到對(duì)應(yīng)的表中。經(jīng)過這樣的變換,當(dāng)查詢表A或表B中的某一行 時(shí)就能夠得到同這一行所關(guān)聯(lián)的所有表C中的數(shù)據(jù),這樣就可以避免表C和同其余與之有 聯(lián)系關(guān)系的所有表之間的連接查詢。當(dāng)對(duì)表C中的數(shù)據(jù)查詢方式有且僅有通過和表A或表 B連接查詢所得時(shí),就可以把表C從由基礎(chǔ)變換所得到的表集合中刪除。
[0050] 具體變換方法為:如圖3所示,令Goods表為表A、Brand表為表B、Picture表為 表C,把表A和表B的表名分別作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名,之后把表A和表B分別 添加到對(duì)應(yīng)表的列族中,把表C都添加到這些表的列族之中。接著把表A和表B的主鍵分 別作為對(duì)應(yīng)表的行鍵,隨后把表A和表B中定義的所有屬性添加到對(duì)應(yīng)表的列族1之中,把 表C中所有同表A或表B這一行有關(guān)的所有行屬性都分別放入到對(duì)應(yīng)表的列族2之中。最 后,根據(jù)情況刪除表C。
[0051] 該變換將子表分割到HBase對(duì)應(yīng)的數(shù)據(jù)庫中的多張主表。由于在變換過程中對(duì)子 表進(jìn)行了一定程度的冗余存儲(chǔ),因而會(huì)消耗稍多的存儲(chǔ)空間,但是提高了由任意主表到子 表的連接查詢的效率。
[0052] 所述內(nèi)聯(lián)變換的適用場(chǎng)景為當(dāng)從表A到表B存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系, 并且從表B到表C也存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系時(shí),可以把表C作為表A的內(nèi)聯(lián)表。 經(jīng)過這樣的變換,當(dāng)查詢表A中的某一行時(shí)就能夠得到同這一行通過表A所間接關(guān)聯(lián)的所 有表C中的數(shù)據(jù),這樣就可以避免表A、表B和表C這三張表之間的連接查詢。當(dāng)對(duì)表C中 的數(shù)據(jù)查詢方式有且僅有通過和表A、表B連接查詢所得時(shí),就可以把表C從由基礎(chǔ)變換所 得到的表集合中刪除。
[0053] 具體變換方法為:如圖4所不,令Goods表為表A、Color表為表B、GoodsRelated 表為表C,把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名,之后把表A和表C都添加到這 個(gè)表的列族中。接著把表A的主鍵作為對(duì)應(yīng)表的行鍵,隨后把表A中定義的所有屬性添加 到對(duì)應(yīng)表的列族1之中,把表C中所有同表A這一行通過表B有間接關(guān)聯(lián)的所有行屬性都 放入到列族2之中。最后,根據(jù)情況刪除表C。
[0054] 該變換將子表內(nèi)聯(lián)到HBase對(duì)應(yīng)的數(shù)據(jù)庫中的間接主表中。由于在變換過程中對(duì) 子表進(jìn)行了一定程度的冗余存儲(chǔ),因而會(huì)消耗稍多的存儲(chǔ)空間,但是提高了由間接主表到 子表的連接查詢的效率。
[0055] 在對(duì)數(shù)據(jù)庫進(jìn)行遷移的過程中需要根據(jù)表與表之間的關(guān)系以及各類變換的適用 場(chǎng)景,來決定應(yīng)該對(duì)哪些表進(jìn)行什么樣的變換。令在關(guān)系型數(shù)據(jù)庫中原有的表集合為X,遷 移后的在HBase數(shù)據(jù)庫中的表集合為Y,總的遷移過程采用如下的決策圖5表示:先判斷集 合X是否為空,否則取出一個(gè)元素 X,對(duì)其做基本變換,將結(jié)果元素 y放入集合Y,是則直接 得到集合Y ;然后判斷元素 y在集合Y中是否與其他元素存在一對(duì)多、多對(duì)多的關(guān)系,是則 取出一個(gè)關(guān)系映射c,并對(duì)關(guān)系映射c做內(nèi)嵌、分割變換;否則進(jìn)一步判斷元素 y在集合Y中 是否需要做內(nèi)聯(lián)變換,如果否則返回判斷集合X是否為空,若是則做內(nèi)聯(lián)變換。
[0056] 數(shù)據(jù)庫遷移工具實(shí)現(xiàn)了將傳統(tǒng)關(guān)系數(shù)據(jù)庫中的表模式轉(zhuǎn)換為HBase數(shù)據(jù)庫定義 的表模式的工作,并且提供了把原有表中的數(shù)據(jù)遷移到對(duì)應(yīng)的HBase數(shù)據(jù)庫的表中的功 能。
[0057] 由于傳統(tǒng)的關(guān)系數(shù)據(jù)庫有著豐富的數(shù)據(jù)類型定義,而HBase在數(shù)據(jù)存儲(chǔ)上都是以 字節(jié)流的方式保存的,通過提供對(duì)應(yīng)的Java工具類而從字節(jié)流中提取所需要的數(shù)據(jù)類型, 因而支持?jǐn)?shù)據(jù)類型相比關(guān)系數(shù)據(jù)庫而言會(huì)相對(duì)少些,所以需要把所有在關(guān)系數(shù)據(jù)庫中用到 的數(shù)據(jù)類型映射到對(duì)應(yīng)的HBase數(shù)據(jù)類型上,并且定義缺省的數(shù)據(jù)類型的轉(zhuǎn)換方法。
[0058] 表1常用數(shù)據(jù)類型映射
[0059]
【權(quán)利要求】
1. 一種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的工具,其特征在于,包括解析器、表模式轉(zhuǎn) 換器、表模式適配器和數(shù)據(jù)表管理器,所述解析器用于解析由外部工具從傳統(tǒng)關(guān)系數(shù)據(jù)庫 導(dǎo)出的表模式定義文檔;所述表模式轉(zhuǎn)換器用于把傳統(tǒng)關(guān)系數(shù)據(jù)庫中的表模式定義轉(zhuǎn)換成 HBase數(shù)據(jù)庫中的表模式,支持前文中所提到的四種表變換的方式;所述表模式適配器用 于保存、讀取已經(jīng)由表模式轉(zhuǎn)換器所轉(zhuǎn)換過的表模式定義到指定的文件中,并為其它模塊 查找新的表模式定義提供接口;所述數(shù)據(jù)表管理器用于把存儲(chǔ)在傳統(tǒng)關(guān)系數(shù)據(jù)庫中的數(shù)據(jù) 遷移到HBase數(shù)據(jù)庫中對(duì)應(yīng)新定義的表中。
2. -種關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,具體包括:在進(jìn)行遷移 前需對(duì)關(guān)系型數(shù)據(jù)庫的表模式進(jìn)行BCNF分解;預(yù)處理后對(duì)關(guān)系型數(shù)據(jù)庫的表模式進(jìn)行變 換包括基本變換、內(nèi)嵌變換、分割變換或內(nèi)聯(lián)變換得到符合HBase數(shù)據(jù)庫定義的表模式;然 后將關(guān)系型數(shù)據(jù)庫的表中的數(shù)據(jù)讀取并轉(zhuǎn)存到Base數(shù)據(jù)庫中對(duì)應(yīng)新定義的表, 所述BCNF分解用于消去非主屬性對(duì)鍵的部分函數(shù)依賴、非主屬性對(duì)鍵的傳遞函數(shù)依 賴以及主屬性對(duì)鍵的傳遞函數(shù)依賴; 所述基本變換適用于把以關(guān)系數(shù)據(jù)庫中表設(shè)計(jì)模式定義的表變換成HBase中的表; 所述內(nèi)嵌變換用于當(dāng)從表A到表B存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系時(shí),把表B作為 表A的內(nèi)嵌表; 所述分割變換用于當(dāng)從表C到其余多個(gè)表之間都存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系 時(shí),把表C進(jìn)行分割,按照數(shù)據(jù)的映射關(guān)系,把表C中的每一行內(nèi)嵌到對(duì)應(yīng)的表中; 所述內(nèi)聯(lián)變換用于當(dāng)從表A到表B存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系,并且從表B到 表C也存在一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系時(shí),把表C作為表A的內(nèi)聯(lián)表; 其中,表C為表B的從屬關(guān)聯(lián)關(guān)系表,表B為表A的從屬關(guān)聯(lián)關(guān)系表。
3. 根據(jù)權(quán)利要求2所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,所述 基本變換具體變換方法為:把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名,表A也添加到 這個(gè)表的列族中;之后把表A的王鍵作為對(duì)應(yīng)表的彳丁鍵;最后把表A中定乂的所有屬性添 加到對(duì)應(yīng)表的列族1之中。
4. 根據(jù)權(quán)利要求2所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,所 述內(nèi)嵌變換具體變換方法為:把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名;之后把表A 和表B都添加到這個(gè)表的列族中;接著把表A的主鍵作為對(duì)應(yīng)表的行鍵;隨后把表A中定義 的所有屬性添加到對(duì)應(yīng)表的列族1之中,把表B中所有同表A這一行有關(guān)的所有行屬性都 放入到列族2之中,最后,刪除表B。
5. 根據(jù)權(quán)利要求2所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,所 述分割變換具體變換方法為:把表A和表B的表名分別作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名; 之后把表A和表B分別添加到對(duì)應(yīng)表的列族中,把表C都添加到這些表的列族之中;接著把 表A和表B的主鍵分別作為對(duì)應(yīng)表的行鍵;隨后把表A和表B中定義的所有屬性添加到對(duì) 應(yīng)表的列族1之中,把表C中所有同表A或表B這一行有關(guān)的所有行屬性都分別放入到對(duì) 應(yīng)表的列族2之中;最后刪除表C。
6. 根據(jù)權(quán)利要求2所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,所 述內(nèi)聯(lián)變換具體變換方法為:把表A的表名作為HBase數(shù)據(jù)庫中對(duì)應(yīng)表的表名;之后把表A 和表C都添加到這個(gè)表的列族中;接著把表A的主鍵作為對(duì)應(yīng)表的行鍵;隨后把表A中定義 的所有屬性添加到對(duì)應(yīng)表的列族1之中,把表C中所有同表A這一行通過表B有間接關(guān)聯(lián) 的所有行屬性都放入到列族2之中;最后刪除表C。
7. 根據(jù)權(quán)利要求2所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,總的 遷移過程采用如下的決策為:先判斷集合X是否為空,否則取出一個(gè)元素 X,對(duì)其做基本變 換,將結(jié)果元素 y放入集合Y,是則直接得到集合Y ;然后判斷元素 y在集合Y中是否與其他 元素存在一對(duì)多、多對(duì)多的關(guān)系,是則取出一個(gè)關(guān)系映射C,并對(duì)關(guān)系映射C做內(nèi)嵌、分割變 換;否則進(jìn)一步判斷元素 y在集合Y中是否需要做內(nèi)聯(lián)變換,如果否則返回判斷集合X是否 為空,若是則做內(nèi)聯(lián)變換。
8. 根據(jù)權(quán)利要求2所述的關(guān)系型數(shù)據(jù)庫遷移到HBase數(shù)據(jù)庫的方法,其特征在于,對(duì)所 有的表模式進(jìn)行如下的簡化處理:為每張表指定一個(gè)自增的主鍵;為表的每個(gè)屬性設(shè)置一 個(gè)默認(rèn)值;減少表名稱和屬性名的長度。
【文檔編號(hào)】G06F17/30GK104123392SQ201410392438
【公開日】2014年10月29日 申請(qǐng)日期:2014年8月11日 優(yōu)先權(quán)日:2014年8月11日
【發(fā)明者】鄭立國, 賈金原, 趙龍 申請(qǐng)人:吉林禹碩動(dòng)漫游戲科技股份有限公司