基于HBase的數(shù)據(jù)導(dǎo)入方法和系統(tǒng)的制作方法
【專利說明】
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及大數(shù)據(jù)處理技術(shù),特別涉及基于HBase的數(shù)據(jù)導(dǎo)入方法和系統(tǒng)。
【【背景技術(shù)】】
[0002]隨著移動(dòng)互聯(lián)網(wǎng)技術(shù)的高速發(fā)展,尤其是智能移動(dòng)終端的廣泛普及,互聯(lián)網(wǎng)相關(guān)企業(yè)的業(yè)務(wù)數(shù)據(jù)量呈現(xiàn)爆發(fā)式的增長。如何快速有效地處理這些數(shù)據(jù),將其轉(zhuǎn)化為有價(jià)值的信息,是亟需解決的問題。HBase (Hadoop Database)作為一個(gè)構(gòu)建在HDFS (HadoopDistributed File System, Hadoop分布式文件系統(tǒng))上,具有高可靠性、高性能、面向列、可伸縮等優(yōu)秀特性的分布式存儲(chǔ)系統(tǒng),為數(shù)據(jù)的存儲(chǔ)和處理提供了經(jīng)濟(jì)、高效、安全和可靠的保障,逐漸成為飽受海量數(shù)據(jù)困擾的企業(yè)存儲(chǔ)數(shù)據(jù)首選的解決方案。
[0003]有多種方法可以將數(shù)據(jù)加載到HBase的數(shù)據(jù)表中,比如通過MapReduce (—種用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算)調(diào)用TableOutputFormat (將MapReduce的輸出導(dǎo)入到HBase的一種方法)方法,或者將數(shù)據(jù)以HBase內(nèi)部的組織格式輸出成文件加載到集群中,這些方法都需要啟動(dòng)MapReduce,有一定的時(shí)間延遲,不能滿足對(duì)進(jìn)行數(shù)據(jù)快速存儲(chǔ)的要求。
【
【發(fā)明內(nèi)容】
】
[0004]基于此,有必要提供一種可提高數(shù)據(jù)導(dǎo)入速度的基于HBase的數(shù)據(jù)導(dǎo)入方法。
[0005]一種基于HBase的數(shù)據(jù)導(dǎo)入方法,包括以下步驟:
[0006]文件名提取線程提取文件壓縮池中新上報(bào)文件的文件名,將提取的文件名存放到無讀寫鎖的隊(duì)列;
[0007]文件處理線程從無讀寫鎖的隊(duì)列中獲取文件名,從所述文件壓縮池中提取文件名對(duì)應(yīng)的文件,讀取文件為文件流;
[0008]文件處理線程將文件流中的行數(shù)據(jù)轉(zhuǎn)換為json對(duì)象;
[0009]文件處理線程根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象;
[0010]存儲(chǔ)線程將構(gòu)造的Row對(duì)象導(dǎo)入HBase中。
[0011]在其中一個(gè)實(shí)施例中,根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象的步驟包括:
[0012]根據(jù)json對(duì)象構(gòu)造Row對(duì)象的行鍵;
[0013]將構(gòu)造的行鍵作為Row對(duì)象的主鍵初始化Row對(duì)象;
[0014]根據(jù)j son對(duì)象構(gòu)造初始化成功的Row對(duì)象的鍵值對(duì)。
[0015]在其中一個(gè)實(shí)施例中,所述根據(jù)json對(duì)象構(gòu)造Row對(duì)象的行鍵的步驟包括:從行鍵構(gòu)造規(guī)則配置文件中讀取json對(duì)象中的表名對(duì)應(yīng)的行鍵構(gòu)造規(guī)則;根據(jù)讀取的行鍵構(gòu)造規(guī)則以及json對(duì)象中的鍵值對(duì)構(gòu)造Row對(duì)象的行鍵;
[0016]根據(jù)json對(duì)象構(gòu)造初始化成功的Row對(duì)象的鍵值對(duì)的步驟包括:根據(jù)json對(duì)象中的表名查找對(duì)應(yīng)的列類型配置文件;將json對(duì)象中的列值轉(zhuǎn)換成其對(duì)應(yīng)列名在列類型配置文件中對(duì)應(yīng)的列類型的值;將經(jīng)過類型轉(zhuǎn)換的列值轉(zhuǎn)化成字節(jié)數(shù)組;將列名與對(duì)應(yīng)的列值構(gòu)成鍵值對(duì)保存到初始化成功的Row對(duì)象中。
[0017]在其中一個(gè)實(shí)施例中,在所述根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象的步驟之后,所述方法還包括:文件處理線程將構(gòu)造的Row對(duì)象保存到緩存池;
[0018]所述存儲(chǔ)線程將構(gòu)造的Row對(duì)象導(dǎo)入HBase中的步驟包括:存儲(chǔ)線程監(jiān)聽緩存池?cái)?shù)據(jù)量大小,當(dāng)緩存池?cái)?shù)據(jù)量大小達(dá)到閾值時(shí),將緩存池中的Row對(duì)象導(dǎo)入HBase中,重置緩存池。
[0019]在其中一個(gè)實(shí)施例中,所述方法還包括步驟:
[0020]驗(yàn)證線程校驗(yàn)HBase返回的寫入結(jié)果,若發(fā)生寫入錯(cuò)誤,則記錄錯(cuò)誤發(fā)生的行數(shù)據(jù)、行數(shù)據(jù)所在文件的文件名及行數(shù)據(jù)在文件中的行號(hào)。
[0021]此外,還有必要提供一種可提高數(shù)據(jù)導(dǎo)入速度的基于HBase的數(shù)據(jù)導(dǎo)入系統(tǒng)。
[0022]一種基于HBase的數(shù)據(jù)導(dǎo)入系統(tǒng),包括以下步驟:
[0023]文件名提取模塊,用于提取文件壓縮池中新上報(bào)文件的文件名,將提取的文件名存放到無讀寫鎖的隊(duì)列;
[0024]文件讀取模塊,用于從隊(duì)列中獲取文件名,從所述文件壓縮池中提取文件名對(duì)應(yīng)的文件,讀取文件為文件流;
[0025]json對(duì)象轉(zhuǎn)換模塊,用于將文件流中的行數(shù)據(jù)轉(zhuǎn)換為json對(duì)象;
[0026]Row對(duì)象構(gòu)造模塊,用于根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象;
[0027]數(shù)據(jù)導(dǎo)入模塊,用于將構(gòu)造的Row對(duì)象導(dǎo)入HBase中;
[0028]控制模塊,用于啟動(dòng)文件名提取線程執(zhí)行文件名提取模塊,啟動(dòng)文件處理線程執(zhí)行文件讀取模塊、json對(duì)象轉(zhuǎn)換模塊和Row對(duì)象構(gòu)造模塊,以及啟動(dòng)存儲(chǔ)線程執(zhí)行數(shù)據(jù)導(dǎo)入模塊。
[0029]在其中個(gè)實(shí)施例中,所述Row對(duì)象構(gòu)造|旲塊包括:
[0030]行鍵構(gòu)造模塊,用于根據(jù)json對(duì)象構(gòu)造Row對(duì)象的行鍵;
[0031 ] Row對(duì)象初始化模塊,用于將構(gòu)造的行鍵作為Row對(duì)象的主鍵初始化Row對(duì)象;
[0032]鍵值對(duì)構(gòu)造模塊,用于根據(jù)json對(duì)象構(gòu)造初始化成功的Row對(duì)象的鍵值對(duì)。
[0033]在其中一個(gè)實(shí)施例中,所述行鍵構(gòu)造模塊包括:
[0034]規(guī)則讀取單元,用于從行鍵構(gòu)造規(guī)則配置文件中讀取json對(duì)象中的表名對(duì)應(yīng)的打鍵構(gòu)造規(guī)則;
[0035]行鍵構(gòu)造單元,根據(jù)讀取的行鍵構(gòu)造規(guī)則以及json對(duì)象中的鍵值對(duì)構(gòu)造Row對(duì)象的行鍵;
[0036]所述鍵值對(duì)構(gòu)造模塊包括:
[0037]配置文件查找單元,用于根據(jù)json對(duì)象中的表名查找對(duì)應(yīng)的列類型配置文件;
[0038]列值轉(zhuǎn)換單元,用于將json對(duì)象中的列值轉(zhuǎn)換成其對(duì)應(yīng)列名在列類型配置文件中對(duì)應(yīng)的列類型的值;
[0039]數(shù)組生成單元,用于將經(jīng)過類型轉(zhuǎn)換的列值轉(zhuǎn)化成字節(jié)數(shù)組;
[0040]鍵值對(duì)保存單元,用于將列名與對(duì)應(yīng)的列值構(gòu)成鍵值對(duì)保存到初始化成功的Row對(duì)象中。
[0041]在其中一個(gè)實(shí)施例中,所述系統(tǒng)還包括數(shù)據(jù)緩存模塊,用于在根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象之后,將構(gòu)造的Row對(duì)象保存到緩存池;
[0042]所述控制模塊還用于啟動(dòng)所述文件處理線程執(zhí)行數(shù)據(jù)緩存模塊;
[0043]所述數(shù)據(jù)導(dǎo)入模塊用于監(jiān)聽緩存池?cái)?shù)據(jù)量大小,當(dāng)緩存池?cái)?shù)據(jù)量大小達(dá)到閾值時(shí),將緩存池中的Row對(duì)象導(dǎo)入HBase中,重置緩存池。
[0044]在其中一個(gè)實(shí)施例中,所述系統(tǒng)還包括驗(yàn)證模塊,用于校驗(yàn)HBase返回的寫入結(jié)果,若發(fā)生寫入錯(cuò)誤,則記錄錯(cuò)誤發(fā)生的行數(shù)據(jù)、行數(shù)據(jù)所在文件的文件名及行數(shù)據(jù)在文件中的行號(hào);
[0045]所述控制模塊還用于啟動(dòng)驗(yàn)證線程執(zhí)行驗(yàn)證模塊。
[0046]上述基于HBase的數(shù)據(jù)導(dǎo)入方法和系統(tǒng),文件名提取線程提取文件壓縮池中新上報(bào)文件的文件名,將提取的文件名存放到無讀寫鎖的隊(duì)列,文件處理線程從無讀寫鎖的隊(duì)列中獲取文件名,并從文件壓縮池中提取文件名對(duì)應(yīng)的文件,讀取文件為文件流;由于隊(duì)列無讀寫鎖,文件名提取線程將文件名存放到隊(duì)列中時(shí)無需加寫鎖、解寫鎖,文件處理線程從無讀寫鎖的隊(duì)列中獲取文件名時(shí),無需加讀鎖、解讀鎖,而且文件名提取線程與文件處理線程可并發(fā)地從隊(duì)列中讀寫數(shù)據(jù),從而提高了讀寫數(shù)據(jù)的速度。進(jìn)一步的,文件處理線程將文件流中的行數(shù)據(jù)轉(zhuǎn)換為json對(duì)象,并根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象;存儲(chǔ)線程將構(gòu)造的Row對(duì)象導(dǎo)入HBase中,文件處理線程與存儲(chǔ)線程可并發(fā)地進(jìn)行工作,兩個(gè)線程之間互不影響工作進(jìn)度。因而,上述基于HBase的數(shù)據(jù)導(dǎo)入方法和系統(tǒng),通過無讀寫鎖隊(duì)列以及多線程并發(fā)處理機(jī)制,可提高將數(shù)據(jù)導(dǎo)入HBase的速度。
【【附圖說明】】
[0047]圖1為一個(gè)實(shí)施例中的基于HBase的數(shù)據(jù)導(dǎo)入方法的流程示意圖;
[0048]圖2為一個(gè)實(shí)施例中根據(jù)json對(duì)象構(gòu)造HBase的Row對(duì)象的步驟的流程示意圖;
[0049]圖3為一個(gè)實(shí)施例中的Row對(duì)象緩存示意圖;
[0050]圖4為一個(gè)實(shí)施例中的基于HBase的數(shù)據(jù)導(dǎo)入方法的流程示意圖;
[0051]圖5為一個(gè)實(shí)施例中的基于HBase的數(shù)據(jù)導(dǎo)入系統(tǒng)結(jié)構(gòu)示意圖;
[0052]圖6為一個(gè)實(shí)施例中Row對(duì)象構(gòu)造模塊的結(jié)構(gòu)示意圖;
[0053]圖7為另一實(shí)施例中的基于HBase的數(shù)據(jù)導(dǎo)入系統(tǒng)結(jié)構(gòu)不意圖;
[0054]圖8為又一實(shí)施例中的基于HBase的數(shù)據(jù)導(dǎo)入系統(tǒng)結(jié)構(gòu)不意圖。
【【具體實(shí)施方式】】
[0055]如圖1所示,在一個(gè)實(shí)施例中,一種基于HBase的數(shù)據(jù)導(dǎo)入方法,包括以下步驟:
[0056]步驟S102,文件名提取線程提取文件壓縮池中新上報(bào)文件的文件名,將提取的文件名存放到無讀寫鎖的隊(duì)列。
[0057]文件壓縮池為文件存儲(chǔ)空間。無讀寫鎖的隊(duì)列為讀寫隊(duì)列中數(shù)據(jù)不需要加解讀寫鎖的隊(duì)列;無讀寫鎖的隊(duì)列可保證線程安全,線程安全指的是在多個(gè)線程并發(fā)讀寫隊(duì)列中數(shù)據(jù)時(shí)不出現(xiàn)錯(cuò)誤。
[0058]在一個(gè)實(shí)施例中,可由日志中心等文件產(chǎn)生方上報(bào)文件到文件壓縮池。文件名提取線程可實(shí)時(shí)監(jiān)測(cè)文件壓縮池中是否有新上報(bào)的文件,當(dāng)文件壓縮池中有新上報(bào)的文件時(shí),提取新上報(bào)文件的文件名。
[0059]步驟S104,文件處理線程從無讀寫鎖的隊(duì)列中獲取文件名,從文件壓縮池中提取文件名對(duì)應(yīng)的文件,讀取文件為文件流。
[0060]文件處理線程可循環(huán)執(zhí)行步驟S104、S106和S108。
[0061]在一個(gè)實(shí)施例中,在讀取文件為文件流的步驟之前,上述基于HBas