, , ,
(湖北大學(xué) 計(jì)算機(jī)與信息工程學(xué)院,武漢 430062)
隨著計(jì)算機(jī)與信息技術(shù)的迅速發(fā)展,企業(yè)應(yīng)用系統(tǒng)的規(guī)模迅速擴(kuò)大,所產(chǎn)生的數(shù)據(jù)呈海量型變化。大數(shù)據(jù)(Big Data)一詞越來(lái)越多地被提及,人們就用它來(lái)描述和定義信息爆炸時(shí)代產(chǎn)生的海量數(shù)據(jù),并命名與之相關(guān)的技術(shù)發(fā)展與創(chuàng)新[1]。在大數(shù)據(jù)時(shí)代,企業(yè)應(yīng)用系統(tǒng)數(shù)據(jù)量快速增長(zhǎng)已達(dá)到PB(1PB=1000TB)甚至EB(1EB=1000PB)級(jí)別,而大多數(shù)企業(yè)應(yīng)用系統(tǒng)之前所使用的數(shù)據(jù)庫(kù)都是傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)[2],實(shí)際上關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)無(wú)法滿(mǎn)足當(dāng)前海量數(shù)據(jù)處理的高擴(kuò)展性、高可用性、高并發(fā)讀寫(xiě)、高吞吐量、較低延遲及高效存儲(chǔ)和查詢(xún)等需求。與關(guān)系型數(shù)據(jù)庫(kù)不同,NoSQL數(shù)據(jù)庫(kù)[3]由于其擴(kuò)展性和可用性強(qiáng)以及靈活的數(shù)據(jù)模型,在大數(shù)據(jù)時(shí)代得到廣泛應(yīng)用。
Hadoop生態(tài)系統(tǒng)中的HBase數(shù)據(jù)庫(kù)是一個(gè)開(kāi)源的基于列的非關(guān)系型分布式數(shù)據(jù)庫(kù),是Apache軟件基金會(huì)的Hadoop項(xiàng)目的一部分,不僅擁有大部分NoSQL數(shù)據(jù)庫(kù)所擁有的特點(diǎn),而且因?yàn)槟芘cHadoop大數(shù)據(jù)平臺(tái)進(jìn)行集成,所以它能在數(shù)據(jù)存儲(chǔ)方面提供更為強(qiáng)大的擴(kuò)展性和在數(shù)據(jù)操作方面提供更為完善的操作性能[4]?;贖Base的巨大優(yōu)勢(shì),如今企業(yè)的應(yīng)用系統(tǒng)都開(kāi)始將HBase數(shù)據(jù)庫(kù)作為進(jìn)行大數(shù)據(jù)的存儲(chǔ)和處理的工具。但是,在實(shí)際需求的限制下,企業(yè)應(yīng)用系統(tǒng)在更改存儲(chǔ)系統(tǒng)時(shí)不應(yīng)該丟失原有系統(tǒng)中的歷史數(shù)據(jù),而是需要將原有系統(tǒng)中的歷史數(shù)據(jù)遷移到新構(gòu)建的存儲(chǔ)系統(tǒng)中,所以如何將原有應(yīng)用系統(tǒng)中的歷史數(shù)據(jù)盡量完整、有策略、自動(dòng)遷移到新構(gòu)建的HBase數(shù)據(jù)庫(kù)中是一個(gè)值得研究的課題。
HBase本身是一種NoSQL數(shù)據(jù)庫(kù),由于其數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)有很大的差異,因此在設(shè)計(jì)數(shù)據(jù)存儲(chǔ)表結(jié)構(gòu)及表關(guān)系時(shí)也有很大的不同,所以要實(shí)現(xiàn)從關(guān)系型數(shù)據(jù)庫(kù)向分布式數(shù)據(jù)庫(kù)HBase進(jìn)行數(shù)據(jù)遷移,需要重新設(shè)計(jì)新構(gòu)建的存儲(chǔ)系統(tǒng)HBase的表模式,這個(gè)過(guò)程是個(gè)比較復(fù)雜的過(guò)程,在完成數(shù)據(jù)遷移過(guò)程后還需要考慮數(shù)據(jù)遷移后數(shù)據(jù)查詢(xún)及存儲(chǔ)的性能問(wèn)題,因此實(shí)現(xiàn)一個(gè)從關(guān)系型數(shù)據(jù)庫(kù)向分布式數(shù)據(jù)庫(kù)HBase進(jìn)行數(shù)據(jù)遷移的方法是非常有必要的。
本文在上述背景及需求下,通過(guò)對(duì)Hadoop大數(shù)據(jù)平臺(tái)、HBase數(shù)據(jù)庫(kù)存儲(chǔ)原理及典型數(shù)據(jù)庫(kù)遷移策略的研究,設(shè)計(jì)基于Hadoop平臺(tái)數(shù)據(jù)遷移方法來(lái)實(shí)現(xiàn)將傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中的歷史數(shù)據(jù)以及表模式向HBase數(shù)據(jù)庫(kù)中進(jìn)行遷移和轉(zhuǎn)換,有效解決之前同類(lèi)遷移工具無(wú)法對(duì)關(guān)系型數(shù)據(jù)庫(kù)中表模式進(jìn)行遷移不足的問(wèn)題。
本文組織結(jié)構(gòu)如下:第1部分簡(jiǎn)述相關(guān)理論基礎(chǔ);第2部分介紹數(shù)據(jù)遷移方法的設(shè)計(jì)思想及具體實(shí)現(xiàn);第3部分對(duì)數(shù)據(jù)遷移方法實(shí)現(xiàn)后的查詢(xún)與存儲(chǔ)等方面與同類(lèi)遷移工具進(jìn)行比較;第4部分總結(jié)全文。
Hadoop[5]是一個(gè)由Apache基金會(huì)根據(jù)Google公司發(fā)表的Google文件系統(tǒng)(GFS)和MapReduce的論文自行實(shí)現(xiàn)而成的分布式系統(tǒng)架構(gòu)。使用者可以在不了解底層細(xì)節(jié)的情況下,開(kāi)發(fā)分布式程序,充分利用集群的作用進(jìn)行高速運(yùn)算和存儲(chǔ)。Hadoop框架最核心的設(shè)計(jì)就是由HDFS(Hadoop Distributed File System:分布式文件系統(tǒng))和MapReduce(分布式計(jì)算框架)組成。
HDFS[6]在Hadoop系統(tǒng)中為海量數(shù)據(jù)提供了存儲(chǔ),為了高數(shù)據(jù)吞吐量而優(yōu)化的,適合那些有超大數(shù)據(jù)集的應(yīng)用程序,有高容錯(cuò)性、低成本的特點(diǎn)。一般情況下,HDFS集群主要由一個(gè)NameNode節(jié)點(diǎn)(master)和多個(gè)DataNode節(jié)點(diǎn)(slave)組成,在集群節(jié)點(diǎn)通信中,NameNode發(fā)揮著管理、協(xié)調(diào)、操控的作用,主要負(fù)責(zé)管理文件系統(tǒng)的命名空間,協(xié)助客戶(hù)端對(duì)文件的訪問(wèn),并對(duì)DataNode發(fā)起的請(qǐng)求進(jìn)行響應(yīng);而DataNode是HDFS中最終存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn),負(fù)責(zé)自身及其他物理節(jié)點(diǎn)的存儲(chǔ)管理。客戶(hù)端向HDFS發(fā)起訪問(wèn)文件請(qǐng)求時(shí),首先需要從NameNode節(jié)點(diǎn)上獲取文件在HDFS中所處的位置信息,根據(jù)文件位置信息找到存儲(chǔ)數(shù)據(jù)塊所在的DataNode,最后讀取DataNode上存儲(chǔ)的數(shù)據(jù)。
MapReduce[7]是為海量數(shù)據(jù)提供了計(jì)算。它是面向大數(shù)據(jù)并行處理的計(jì)算模型、框架和平臺(tái)。在一個(gè)MapReduce計(jì)算任務(wù)過(guò)程中,主要有兩個(gè)階段:Map(映射)階段和Reduce(歸約)階段,每個(gè)階段都是以鍵值對(duì)作為輸入和輸出,Map階段負(fù)責(zé)對(duì)輸入文件進(jìn)行切分處理,然后匯總再分組給Reduce進(jìn)行處理,達(dá)到高效的分布式計(jì)算效率。
HBase[8]是Apache Hadoop中的一個(gè)子項(xiàng)目,是Google BigTable的開(kāi)源實(shí)現(xiàn),依托于Hadoop的HDFS作為最基本存儲(chǔ)基礎(chǔ)單元,通過(guò)使用Hadoop的DFS工具就可以看到這些數(shù)據(jù)存儲(chǔ)文件夾的結(jié)構(gòu),還可以通過(guò)Map/Reduce的框架對(duì)HBase進(jìn)行操作。
HBase是一個(gè)分布式、面向列的數(shù)據(jù)存儲(chǔ)系統(tǒng),與關(guān)系型數(shù)據(jù)庫(kù)的模式固定,面向行的數(shù)據(jù)庫(kù)具有ACID性質(zhì)不同,HBase是一個(gè)適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫(kù),是介于Map Entry(key&value)和DB Row之間的一種數(shù)據(jù)存儲(chǔ)方式。HBase中的數(shù)據(jù)是依靠行健(RowKey)、列族(ColumnFamily)、列標(biāo)識(shí)(ColumnQualifier)、時(shí)間戳(TimeStamp)來(lái)標(biāo)識(shí)一個(gè)單元格中的數(shù)據(jù)。表1是HBase的簡(jiǎn)單邏輯視圖。
表1 HBase邏輯視圖
表1表示的是在HBase數(shù)據(jù)庫(kù)中保存的兩條訂單信息1001和1002,其中1001和1002是表示行鍵,orderInfo是列族,在orderInfo列族中包含有username、phoneNum、orderStatus列標(biāo)識(shí)。如要獲取某一單元格中的訂單信息,則可使用{RowKey,column(=
RowKey{
ColumnFamily1{
Column1:
T2:value2
T1:value1
Column2:
T1:value3
}
ColumnFamily2{
T3:value4
}
}
由表1和HBase數(shù)據(jù)模型的JSON格式的一般形式可以看出HBase與RDBMS之間有很大的不同,其實(shí)HBase是基于列族的、稀疏的、多維的數(shù)據(jù)庫(kù)系統(tǒng),所以在設(shè)計(jì)數(shù)據(jù)遷移方法時(shí)需要充分考慮HBase數(shù)據(jù)模型的特點(diǎn)。
HBase的底層存儲(chǔ)結(jié)構(gòu)如圖1所示,是按列族存儲(chǔ)的。
圖1 HBase底層存儲(chǔ)結(jié)構(gòu)
某一RowKey的數(shù)據(jù)(如表1)雖然在數(shù)據(jù)模型上看是在一行上,但是在HBase底層存儲(chǔ)中是分開(kāi)存儲(chǔ)的,如圖1所示,數(shù)據(jù)在存儲(chǔ)時(shí),HBase會(huì)自動(dòng)的將表水平劃分成多個(gè)區(qū)域(Region),每個(gè)Region中會(huì)保存某段連續(xù)的數(shù)據(jù),而一個(gè)Region包含多個(gè)Store,這里每一個(gè)Store就是一個(gè)ColumnFamily(列族),由此可以看出,HBase在底層存儲(chǔ)時(shí),同一列族的數(shù)據(jù)存儲(chǔ)在一個(gè)文件中,不同列族的數(shù)據(jù)存儲(chǔ)在不同的文件之中,而且HBase中并不是所有的行和列中都存儲(chǔ)數(shù)據(jù),不存儲(chǔ)數(shù)據(jù)的單元格不占存儲(chǔ)空間,每一個(gè)store在初始化時(shí)設(shè)置了固定存儲(chǔ)大??;另外,雖然HBase列標(biāo)識(shí)可以有上百萬(wàn)列,由于HBase結(jié)構(gòu)中的HFile有一定的大小限制,如果一行數(shù)據(jù)量太大,在存儲(chǔ)時(shí)會(huì)導(dǎo)致HFile無(wú)法選擇合適的分割點(diǎn)。
由于HBase底層存儲(chǔ)有以上特點(diǎn),在設(shè)計(jì)數(shù)據(jù)遷移方法的HBase表模式時(shí)應(yīng)考慮無(wú)論數(shù)據(jù)量的大小,每個(gè)列族都占用固定的存儲(chǔ)空間(初始化前確定)這一因素,所以應(yīng)該盡可能少的創(chuàng)建列族,HBase官方文檔推薦是創(chuàng)建最好不多于三個(gè)列族,故將相鄰的數(shù)據(jù)、經(jīng)常在一起使用的數(shù)據(jù)放在同一列族下,這樣不僅可以減少數(shù)據(jù)存儲(chǔ)空間而且可以有效減少檢索時(shí)查詢(xún)存儲(chǔ)文件的次數(shù)。
綜合考慮HBase數(shù)據(jù)模型及HBase數(shù)據(jù)存儲(chǔ)的特點(diǎn),在設(shè)計(jì)HBase的數(shù)據(jù)格式時(shí)需要充分利用行鍵(RowKey),適當(dāng)?shù)氖褂昧凶?ColumnFamily),將關(guān)系型數(shù)據(jù)庫(kù)中需要索引的字段盡量放在RowKey或列族中來(lái)提高數(shù)據(jù)存儲(chǔ)和查詢(xún)的性能。
由于HBase與關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別,所以在進(jìn)行關(guān)系型數(shù)據(jù)庫(kù)(MySQL)向非關(guān)系數(shù)據(jù)庫(kù)(HBase)的數(shù)據(jù)遷移時(shí),需要重新設(shè)計(jì)HBase的數(shù)據(jù)表模式。在設(shè)計(jì)HBase表模式時(shí)要充分考慮HBase數(shù)據(jù)的存儲(chǔ)和查詢(xún)特點(diǎn),使得系統(tǒng)業(yè)務(wù)數(shù)據(jù)的存儲(chǔ)性能和查詢(xún)效率較高。
在數(shù)據(jù)存儲(chǔ)上,由1.2節(jié)HBase存儲(chǔ)原理可知,HBase底層是按列族進(jìn)行存儲(chǔ)的,每個(gè)表中包含有多個(gè)區(qū)域,而一個(gè)區(qū)域中包含多個(gè)store,這里的一個(gè)store就代表一個(gè)列族,每個(gè)store在初始化時(shí)給定固定值,由此可知,HBase表中的列族越多就越占用空間,所以在設(shè)計(jì)HBase表時(shí)盡量按照官方文檔建議列族最好不多于三個(gè),故將相鄰的、經(jīng)常使用的數(shù)據(jù)放在一個(gè)列族中以減少存儲(chǔ)空間和提高查詢(xún)效率。
在數(shù)據(jù)查詢(xún)上,由于HBase不支持表間關(guān)聯(lián)查詢(xún)[10],所以在進(jìn)行數(shù)據(jù)庫(kù)遷移時(shí)需要充分考慮關(guān)系型數(shù)據(jù)庫(kù)中的表間關(guān)系在HBase數(shù)據(jù)庫(kù)中的體現(xiàn),相對(duì)于關(guān)系型數(shù)據(jù)庫(kù),在HBase數(shù)據(jù)庫(kù)中就需要對(duì)HBase表模式進(jìn)行重新設(shè)計(jì),提高HBase的查詢(xún)效率,由此本文提出關(guān)于MySQL數(shù)據(jù)庫(kù)到HBase數(shù)據(jù)庫(kù)的幾種表轉(zhuǎn)換關(guān)系原則。
在對(duì)HBase的表模式進(jìn)行設(shè)計(jì)時(shí),以關(guān)系型數(shù)據(jù)庫(kù)MySQL數(shù)據(jù)庫(kù)的表間關(guān)系為基準(zhǔn),分為“基本變換”、“‘一對(duì)一’變換”、“‘一對(duì)多’變換”,“‘多對(duì)多’變換”四種變換,下面詳細(xì)介紹其變換規(guī)則[11-14]。
2.2.1 基本變換
此類(lèi)變換對(duì)應(yīng)于MySQL數(shù)據(jù)庫(kù)向HBase數(shù)據(jù)庫(kù)進(jìn)行單表遷移沒(méi)有表間關(guān)系也即是基本表遷移的情況,表模式變換即用基本變換方法將MySQL數(shù)據(jù)庫(kù)中表模式變換成符合HBase數(shù)據(jù)庫(kù)的表模式。
具體變換方法說(shuō)明:如圖2所示,將MySQL數(shù)據(jù)庫(kù)中A表的表名作為HBase數(shù)據(jù)庫(kù)中對(duì)應(yīng)表的表名HA,在HA中創(chuàng)建表A的自定義列族CF1,并將表A中的所有列作為HA表列族CF1中的列標(biāo)識(shí)(ColumnQualifier)。最后以表A的主鍵作為HA的RowKey進(jìn)行數(shù)據(jù)導(dǎo)入。
圖2 基本變換
此類(lèi)是數(shù)據(jù)庫(kù)基本表的遷移,所以在海量數(shù)據(jù)的存儲(chǔ)和查詢(xún)的效率上與HBase的一般表的存儲(chǔ)和查詢(xún)效率一樣。
2.2.2 “一對(duì)一”變換
此類(lèi)變換對(duì)應(yīng)于MySQL數(shù)據(jù)庫(kù)中表間關(guān)系為“一對(duì)一”的關(guān)系類(lèi)型的數(shù)據(jù)表遷移,表模式變換即將MySQL中兩張表的記錄轉(zhuǎn)換成HBase中一張表的記錄,存儲(chǔ)兩張相關(guān)聯(lián)表的信息。
具體變換方法說(shuō)明:如圖3所示,在MySQL數(shù)據(jù)庫(kù)中有數(shù)據(jù)表A和B,表A與表B的表間關(guān)系是“一對(duì)一”關(guān)系,現(xiàn)將表A的表名作為HBase數(shù)據(jù)表HA的表名,并創(chuàng)建表A和表B在HA中的列族CF1和CF2,將表A中所有列添加到表A對(duì)應(yīng)的列族CF1中,同時(shí)將與表A相關(guān)聯(lián)的表B的所有列添加到相對(duì)應(yīng)的列族CF2中,根據(jù)實(shí)際需求對(duì)表B進(jìn)行保留或刪除操作,即完成“一對(duì)一”關(guān)系變換。
圖3 “一對(duì)一”變換
此類(lèi)“一對(duì)一”變換,可以有效解決HBase中無(wú)法進(jìn)行表間的連接查詢(xún)問(wèn)題,由“一對(duì)一”變換圖可知,存儲(chǔ)的數(shù)據(jù)看似冗余,消耗更多的存儲(chǔ)空間,但是提高了表間數(shù)據(jù)的連接查詢(xún)效率。
2.2.3 “一對(duì)多”變換
此類(lèi)變換對(duì)應(yīng)于MySQL數(shù)據(jù)庫(kù)中表間關(guān)系為“一對(duì)多”的關(guān)系類(lèi)型的數(shù)據(jù)表遷移,表模式變換即將MySQL中“一”的一端對(duì)應(yīng)的多條關(guān)聯(lián)表記錄在HBase中的一條記錄進(jìn)行存儲(chǔ),而“多”的一端與“一對(duì)一”變換類(lèi)似。
具體變換方法說(shuō)明:如圖4所示,在MySQL數(shù)據(jù)庫(kù)中有表A和表B,表A和表B的表間關(guān)系是“一對(duì)多”關(guān)系,現(xiàn)將表A的表名作為HBase中HA的表名,并創(chuàng)建表A的列族CF1以及關(guān)系表表B的列族CF2,同時(shí)將表A的所有列添加到對(duì)應(yīng)的CF1中,將與表A相關(guān)聯(lián)的N條記錄的表B的主鍵添加到列族CF2中;對(duì)于MySQL中表B類(lèi)似于“一對(duì)一”變換,完成表A和表B兩表的變換即完成“一對(duì)多”變換。
圖4 “一對(duì)多”變換
此類(lèi)“一對(duì)多”變換,可以在HBase中通過(guò)行鍵查詢(xún)可以得到表A的記錄,并且可以由關(guān)聯(lián)關(guān)系快速查詢(xún)到表A對(duì)應(yīng)表B的關(guān)聯(lián)信息,由“一對(duì)多”變換圖可知,存儲(chǔ)的數(shù)據(jù)看似冗余,消耗了更多的存儲(chǔ)空間,但是提高了表間數(shù)據(jù)的連接查詢(xún)效率。
2.2.4 “多對(duì)多”變換
此類(lèi)變換對(duì)應(yīng)于MySQL數(shù)據(jù)庫(kù)中表間關(guān)系為“多對(duì)多”的關(guān)系類(lèi)型的數(shù)據(jù)表,而且在中間表中有本表自有屬性列的情況,表模式轉(zhuǎn)換即根據(jù)中間表信息,將MySQL中兩張關(guān)聯(lián)表對(duì)應(yīng)的多條記錄在HBase中一條記錄中存儲(chǔ),同理將中間表中自有屬性根據(jù)“一對(duì)多”或“多對(duì)多”表模式轉(zhuǎn)換方式進(jìn)行轉(zhuǎn)換。
具體轉(zhuǎn)換方法說(shuō)明:如圖5所示,在MySQL數(shù)據(jù)庫(kù)中有表A、表B以及表C,其中表A和表B表間關(guān)系是“多對(duì)多”關(guān)系,表A和表B的中間表為表C,表C中有本表自有屬性?,F(xiàn)將表A的表名作為HBase中HA的表名,并創(chuàng)建表A的列族CF1、關(guān)聯(lián)表表B的列族CF2以及中間表表C的列族CF3,同時(shí)將表A中的所有列添加到列族CF1中,將與表A相關(guān)聯(lián)的N條記錄的表B的主鍵添加到CF2中,同理將中間表表C中與表A相關(guān)聯(lián)的列添加到列族CF3中。對(duì)于表B的模式轉(zhuǎn)換同表A一樣,根據(jù)實(shí)際需求決定保存或刪除表C,即完成“多對(duì)多”變換。
圖5 “多對(duì)多”變換
此類(lèi)“多對(duì)多”變換,可以在HBase中根據(jù)行鍵查詢(xún)快速得到表A、表B中記錄的關(guān)聯(lián)信息,由以上變換圖可知,存儲(chǔ)的數(shù)據(jù)看似冗余,消耗了更多的存儲(chǔ)空間,但是提高了表間數(shù)據(jù)的連接查詢(xún)效率。
2.3.1 遷移流程
在完成對(duì)HBase的表模式設(shè)計(jì)之后,需要了解數(shù)據(jù)遷移流程,本文在數(shù)據(jù)遷移過(guò)程中,利用了XML標(biāo)記語(yǔ)言[15-16]對(duì)數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理的特點(diǎn),采用XML文件作為存儲(chǔ)源數(shù)據(jù)庫(kù)表的元數(shù)據(jù),由此對(duì)于基于Hadoop平臺(tái)的數(shù)據(jù)遷移流程分為以下幾個(gè)部分:
1)建立HBase數(shù)據(jù)庫(kù),并獲得源數(shù)據(jù)庫(kù)和目標(biāo)HBase數(shù)據(jù)庫(kù)的連接信息;
2)根據(jù)源數(shù)據(jù)庫(kù)的連接信息,獲取數(shù)據(jù)庫(kù)表的元數(shù)據(jù)并保存在XML文件中;
3)根據(jù)XML文件信息,按照2.2節(jié)中表模式轉(zhuǎn)換原則建立HBase數(shù)據(jù)庫(kù)表模式;
4)將關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)按照2.2節(jié)中表模式轉(zhuǎn)換原則遷移至新建立的HBase數(shù)據(jù)表中。
整體數(shù)據(jù)遷移流程如圖6所示。
圖6 數(shù)據(jù)遷移流程
2.3.2 具體實(shí)現(xiàn)
在數(shù)據(jù)遷移的主要流程中,其中第二部分中需要?jiǎng)?chuàng)建源數(shù)據(jù)庫(kù)表的元數(shù)據(jù)XML文件。在程序設(shè)計(jì)中通過(guò)以下步驟及方法獲取數(shù)據(jù)庫(kù)表元數(shù)據(jù):
1)連接源數(shù)據(jù)庫(kù):public static Connection getConnectDB();
2)獲取源數(shù)據(jù)庫(kù)的元數(shù)據(jù):DatabaseMetaDatadbMetaData = ct.getMetaData();
3)獲取源數(shù)據(jù)庫(kù)所有數(shù)據(jù)表:ResultSettablesResultSet = dbMetaData.getTables(catalog,null,null,new String[]{"TABLE"});
4)獲取源數(shù)據(jù)庫(kù)表的主鍵:ResultSetpkResultSet = dbMetaData.getPrimaryKeys(catalog,null,tableName);
5)獲取源數(shù)據(jù)庫(kù)表的外鍵:ResultSetfkResultSet = dbMetaData.getImportedKeys(catalog,null,tableName);
6)獲取源數(shù)據(jù)庫(kù)表的字段名:rsMetaData.getColumnName(i);
在獲取源數(shù)據(jù)庫(kù)所有表的元數(shù)據(jù)的基礎(chǔ)上,創(chuàng)建保存源數(shù)據(jù)庫(kù)表元數(shù)據(jù)的XML文件流程如圖7所示。
圖7 創(chuàng)建XML文件流程圖
根據(jù)創(chuàng)建XML文件流程,創(chuàng)建的XML文件格式如下:
在此XML文件中記錄著源數(shù)據(jù)庫(kù)中所有表的元數(shù)據(jù),主要包括表名、主鍵、外鍵所在表、字段名及字段類(lèi)型,通過(guò)源數(shù)據(jù)庫(kù)表元數(shù)據(jù)文件創(chuàng)建目標(biāo)數(shù)據(jù)庫(kù)HBase的表模式。
創(chuàng)建HBase表模式步驟如下:
1)通過(guò)高性能的DOM4J方式讀取源數(shù)據(jù)庫(kù)表元數(shù)據(jù)XML文件;
2)根據(jù)XML文件中