一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法
【專利摘要】本發(fā)明公開了一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法,其中基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)包括數(shù)據(jù)緩存區(qū)、數(shù)據(jù)活躍區(qū)和數(shù)據(jù)永久區(qū);基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)的文件存取方法包括文件存儲、文件訪問和文件永久化處理三個過程;該基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法設(shè)計多級存儲機制,并采用文件的預(yù)取機制,有效提高了小文件的存取效率,顯著地降低了集群NameNode的內(nèi)存消耗,有效提高了磁盤的利用率。
【專利說明】
一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法
技術(shù)領(lǐng)域
[0001]本發(fā)明屬于數(shù)據(jù)存儲技術(shù)領(lǐng)域,特別涉及一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法。
【背景技術(shù)】
[0002]針對航空物流行業(yè)來說,由于大多數(shù)信息的交換都是以報文的形式存在,而且報文的類型也比較多,主要類型有3種:xml、cimp、typeb,其中xml類型的數(shù)據(jù)占80%以上,每個報文的大小基本在l_3kB左右。航空物流信息系統(tǒng)的iLink平臺上每天的數(shù)據(jù)交換量在1G左右,對于1G大小的數(shù)據(jù)來說,大約有上千萬個報文。隨著民航信息產(chǎn)業(yè)的不斷發(fā)展,導(dǎo)致海量數(shù)據(jù)信息呈爆炸式增長,傳統(tǒng)的數(shù)據(jù)存儲方式已經(jīng)不能應(yīng)對當(dāng)前產(chǎn)業(yè)的需求,原因主要存在兩方面:一方面是存儲效率不高,另一方面是響應(yīng)時間過長;因此,各企業(yè)單位為了滿足生產(chǎn)的需要,逐漸將數(shù)據(jù)接入云存儲平臺存儲。
[0003]目前,最典型的云存儲平臺是Hadoop分布式文件系統(tǒng)(HDFS),相對于傳統(tǒng)的存儲介質(zhì),Hadoop分布式文件系統(tǒng)(HDFS)通過多臺廉價的機器支持大規(guī)模的文件存儲,伸縮性強,解決了存儲空間的限制性問題;與此同時,HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用,而且即使在出錯的情況下也能保證數(shù)據(jù)存儲的可靠;然而HDFS是專門針對大文件存儲的分布式系統(tǒng),存儲小文件效率極其低下,在HDFS存儲小文件的時候,分布式集群NameNode會消耗大量的內(nèi)存空間去管理每個小文件的元數(shù)據(jù),使得文件的訪問效率大大降低,另外HDFS的存儲是按照數(shù)據(jù)塊存儲的,大量的小文件存儲就會極大地浪費磁盤空間,導(dǎo)致存儲效率不高。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的是提供一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法。
[0005]為此,本發(fā)明技術(shù)方案如下:
[0006]一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)包括數(shù)據(jù)緩存區(qū)、數(shù)據(jù)活躍區(qū)和數(shù)據(jù)永久區(qū);其中數(shù)據(jù)活躍區(qū)位于數(shù)據(jù)緩存區(qū)和數(shù)據(jù)永久區(qū)之間;
[0007]所述的數(shù)據(jù)緩存區(qū)位于每個數(shù)據(jù)節(jié)點的節(jié)點內(nèi)存中,采用Redis內(nèi)存數(shù)據(jù)庫做緩存,且各數(shù)據(jù)節(jié)點的Redis數(shù)據(jù)庫之間自建集群,用于存儲小文件的索引和緩存數(shù)據(jù)預(yù)取機制的文件;
[0008]所述的數(shù)據(jù)活躍區(qū)屬于HDFS的數(shù)據(jù)節(jié)點的數(shù)據(jù)存儲區(qū),用于存儲在活躍區(qū)內(nèi)的文件數(shù)據(jù);
[0009]所述的數(shù)據(jù)永久區(qū)屬于HDFS的數(shù)據(jù)節(jié)點的數(shù)據(jù)存儲區(qū),并采用數(shù)據(jù)塊的壓縮式存儲方式對數(shù)據(jù)進行存儲;
[0010]所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)的文件存取方法包括文件存儲、文件訪問和文件永久化處理三個過程;
[0011]所述的文件存儲過程包括按順序進行的下列步驟:
[0012]步驟I):將海量的小文件批量的讀取到Redis內(nèi)存中,解析小文件,將文件的航班號和文件類型提取出來;
[0013]步驟2):將提取出的文件航班號、文件類型和文件一起批量的存儲到數(shù)據(jù)緩存區(qū)的Redis緩存中,并利用Redis的客戶端分片功能來擴展寫的性能;
[0014]步驟3):將一次航班的業(yè)務(wù)性報文和非業(yè)務(wù)性報文分別聚集起來,并將它們加入文件合并進程,在數(shù)據(jù)緩存區(qū)的Redis緩存中建立每個小文件的索引,在合并的文件中建立內(nèi)部索引,將文件在大文件中的偏移量返回給Redis;
[0015]步驟4):將合并好的文件提交至HDFS客戶端,將文件存儲到HDFS上。
[0016]所述的文件訪問過程包括按順序進行的下列步驟:
[0017]a、接收應(yīng)用程序的文件訪問請求,再將請求提交給Redis客戶端;
[0018]b、在數(shù)據(jù)緩存區(qū)的Redis數(shù)據(jù)庫中搜索要讀取的文件,如果能找到,立即將報文反饋給應(yīng)用程序,并結(jié)束訪問,否則進入步驟c;
[0019]c、在Redis數(shù)據(jù)庫中搜索文件索引表,找到要讀取的文件對應(yīng)的索引,根據(jù)索引找到在HDFS上存儲的位置;
[0020]d、據(jù)步驟c查找的文件索引,解析文件索引中讀取的文件是否已經(jīng)持久化,若沒有持久化,生成一條文件讀取命令提交給HDFS的客戶端,從HDFS上讀取想要的文件,否則進入步驟e;
[0021]e、向HDFS的客戶端提交一個數(shù)據(jù)塊解壓縮命令,將要訪問的數(shù)據(jù)塊從數(shù)據(jù)永久級解壓縮成數(shù)據(jù)活躍級;
[0022]f、從HDFS讀取想要的文件,并轉(zhuǎn)存到數(shù)據(jù)緩存區(qū)的Redis數(shù)據(jù)庫中,并將文件反饋給應(yīng)用程序;
[0023]g、數(shù)據(jù)預(yù)存機制被觸發(fā),根據(jù)上一時刻讀取文件在數(shù)據(jù)塊中的偏移量,通過數(shù)據(jù)塊內(nèi)部索引確定要預(yù)取的數(shù)據(jù)的偏移量和長度,將數(shù)據(jù)發(fā)送到數(shù)據(jù)緩存區(qū)并存儲到Redis。
[0024]所述的文件永久化處理過程包括按順序進行的下列步驟:
[0025]I)永久化監(jiān)視器向Redis客戶端提交一次統(tǒng)計查詢,將屬于同一數(shù)據(jù)塊的文件做一次統(tǒng)計,判斷這一數(shù)據(jù)塊的文件的上一次訪問時間是否都超過了設(shè)定的永久化時間,沒有超過繼續(xù)監(jiān)視,否則進入步驟2);
[0026]2)向HDFS的客戶端提交一次數(shù)據(jù)塊永久化任務(wù);
[0027]3)HDFS客戶端接到數(shù)據(jù)永久化任務(wù),針對這些數(shù)據(jù)塊進行一次壓縮,將這些數(shù)據(jù)從數(shù)據(jù)活躍區(qū)轉(zhuǎn)移到數(shù)據(jù)永久區(qū)。
[0028]與現(xiàn)有技術(shù)相比,該發(fā)明提供的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法主要結(jié)合當(dāng)前最流行的云存儲平臺,又結(jié)合使用內(nèi)存數(shù)據(jù)庫Redis,并根據(jù)航空物流數(shù)據(jù)的基于時間的有效性,設(shè)計多級存儲機制,并采用文件的預(yù)取機制,有效提高了小文件的存取效率,顯著地降低了集群NameNode的內(nèi)存消耗,控制了磁盤數(shù)據(jù)的快速增長,有效提高了磁盤的利用率。
【附圖說明】
[0029]圖1為分布式多級存儲結(jié)構(gòu)。
[0030]圖2為數(shù)據(jù)塊內(nèi)部索引結(jié)構(gòu)示意圖。
[0031]圖3為文件存儲流程圖。
[0032]圖4為文件訪問流程圖。
[0033]圖5為文件永久化處理流程圖。
[0034]圖6為本發(fā)明的存取方法與原生的HDFS存儲時間對比圖。
[0035]圖7為本發(fā)明的存取方法與原生的HDFS內(nèi)存占用量對比圖。
[0036]圖8為本發(fā)明的存取方法與原生的HDFS隨機讀取時所用時間對比圖。
[0037]圖9為本發(fā)明的存取方法與原生的HDFS順序讀取時所用時間對比圖。
[0038]圖10為本發(fā)明的存取方法與原生的HDFS隨時間增長文件存儲量對比圖。
【具體實施方式】
[0039]下面結(jié)合附圖及具體實施例對本發(fā)明做進一步的說明,但下述實施例絕非對本發(fā)明有任何限制。
[°04°]如圖1-5所示,該基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)包括數(shù)據(jù)緩存區(qū)、數(shù)據(jù)活躍區(qū)和數(shù)據(jù)永久區(qū);其中數(shù)據(jù)活躍區(qū)位于數(shù)據(jù)緩存區(qū)和數(shù)據(jù)永久區(qū)之間;
[0041]所述的數(shù)據(jù)緩存區(qū)位于每個數(shù)據(jù)節(jié)點的節(jié)點內(nèi)存中,采用Redis內(nèi)存數(shù)據(jù)庫做緩存,且各數(shù)據(jù)節(jié)點的Redis數(shù)據(jù)庫之間自建集群,用于存儲小文件的索引和緩存數(shù)據(jù)預(yù)取機制的文件;
[0042]所述的數(shù)據(jù)活躍區(qū)屬于HDFS的數(shù)據(jù)節(jié)點的數(shù)據(jù)存儲區(qū),用于存儲在活躍區(qū)內(nèi)的文件數(shù)據(jù);
[0043]所述的數(shù)據(jù)永久區(qū)屬于HDFS的數(shù)據(jù)節(jié)點的數(shù)據(jù)存儲區(qū),并采用數(shù)據(jù)塊的壓縮式存儲方式對數(shù)據(jù)進行存儲;
[0044]所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)的文件存取方法包括文件存儲、文件訪問和文件永久化處理三個過程;
[0045]所述的文件存儲過程包括按順序進行的下列步驟:
[0046]步驟I):將海量的小文件批量地讀取到Redis內(nèi)存中,解析小文件,將文件的航班號和文件類型提取出來;
[0047]步驟2):將提取出的文件航班號、文件類型和文件一起批量地存儲到數(shù)據(jù)緩存區(qū)的Redis緩存中,并利用Redis的客戶端分片功能來擴展寫的性能;
[0048]步驟3):將一次航班的業(yè)務(wù)性報文和非業(yè)務(wù)性報文分別聚集起來,并將它們加入文件合并進程,在數(shù)據(jù)緩存區(qū)的Redis緩存中建立每個小文件的索引,在合并的文件中建立內(nèi)部索引,將文件在大文件中的偏移量返回給Redis;
[0049]步驟4):將合并好的文件提交至HDFS客戶端,將文件存儲到HDFS上。
[0050]所述的文件訪問過程包括按順序進行的下列步驟:
[0051 ] a、接收應(yīng)用程序的文件訪問請求,再將請求提交給Redis客戶端;
[0052]b、在數(shù)據(jù)緩存區(qū)的Redis數(shù)據(jù)庫中搜索要讀取的文件,如果能找到,立即將報文反饋給應(yīng)用程序,并結(jié)束訪問,否則進入步驟c;
[0053]c、在Redis數(shù)據(jù)庫中搜索文件索引表,找到要讀取的文件對應(yīng)的索引,根據(jù)索引找到在HDFS上存儲的位置;
[0054]d、據(jù)步驟c查找的文件索引,解析文件索引中讀取的文件是否已經(jīng)持久化,若沒有持久化,生成一條文件讀取命令提交給HDFS的客戶端,從HDFS上讀取想要的文件,否則進入步驟e;
[0055]e、向HDFS的客戶端提交一個數(shù)據(jù)塊解壓縮命令,將要訪問的數(shù)據(jù)塊從數(shù)據(jù)永久級解壓縮成數(shù)據(jù)活躍級;
[0056]f、從HDFS讀取想要的文件,并轉(zhuǎn)存到數(shù)據(jù)緩存區(qū)的Redis數(shù)據(jù)庫中,并將文件反饋給應(yīng)用程序;
[0057]g、數(shù)據(jù)預(yù)存機制被觸發(fā),根據(jù)上一時刻讀取文件在數(shù)據(jù)塊中的偏移量,通過數(shù)據(jù)塊內(nèi)部索引確定要預(yù)取的數(shù)據(jù)的偏移量和長度,將數(shù)據(jù)發(fā)送到數(shù)據(jù)緩存區(qū)并存儲到Redis。
[0058]所述的文件永久化處理過程包括按順序進行的下列步驟:
[0059]I)永久化監(jiān)視器向Redis客戶端提交一次統(tǒng)計查詢,將屬于同一數(shù)據(jù)塊的文件做一次統(tǒng)計,判斷這一數(shù)據(jù)塊的文件的上一次訪問時間是否都超過了設(shè)定的永久化時間,沒有超過繼續(xù)監(jiān)視,否則進入步驟2);
[0060]2)向HDFS的客戶端提交一次數(shù)據(jù)塊永久化任務(wù);
[0061]3)HDFS客戶端接到數(shù)據(jù)永久化任務(wù),針對這些數(shù)據(jù)塊進行一次壓縮,將這些數(shù)據(jù)從數(shù)據(jù)活躍區(qū)轉(zhuǎn)移到數(shù)據(jù)永久區(qū)。
[0062]本發(fā)明提供的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)及其存取方法的實施方式如下:
[0063]采用64位Cent0S7操作系統(tǒng)、2.6.4的Hadoop版本和3.0的Redis版本來搭建5個節(jié)點的集群環(huán)境,每個節(jié)點擁有I個CHJ和2G內(nèi)存,HDFS的數(shù)據(jù)副本設(shè)置2份,本實驗的數(shù)據(jù)為由某航空物流部門提供的某一周內(nèi)的部分航空物流數(shù)據(jù);
[0064]為了對比原生的HDFS方法和本發(fā)明提供的存取方法在文件存儲效率和集群NameNode的內(nèi)存占用量,分別進行五次實驗,這五次實驗分別存儲10000個,50000個,100000個,150000個,200000個小文件進行對比,實驗結(jié)果如圖6和圖7所示;
[0065]從圖6可以看出來,隨著存儲文件數(shù)據(jù)量的增長,原生的HDFS方法所用的存儲時間越來越長,而本發(fā)明提供的存取方法存儲文件的時間增長緩慢,相比之下,本發(fā)明提供的存取方法存儲文件的效率要高很多;從圖7可以看出來,隨著文件數(shù)量的增多,原生的HDFS的集群NameNode內(nèi)存占用量呈直線增長趨勢,而本發(fā)明提供的存取方法的集群NameNode的內(nèi)存占用量增長率基本為零。
[0066]為了對比原生的HDFS和本發(fā)明提供的存取方法對小文件的讀取效率,選取15萬個小文件,分別采用隨機讀取和順序讀取方式進行試驗,結(jié)果如圖8和圖9所示;
[0067]從圖8可以看出,當(dāng)對文件進行隨機讀取時,原生的HDFS和本發(fā)明提供的存取方法的文件讀取效率基本上是一致的,且有時本發(fā)明提供的文件存取方法的讀取效率比原生的HDFS要高;從圖9可以看出,當(dāng)采用順序讀取方式讀取文件時,本發(fā)明提供的文件存取方法采用了緩存機制和數(shù)據(jù)預(yù)取機制,文件讀取效率明顯地高于原生的HDFS,本發(fā)明提供的文件存取方法的文件讀取時間基本上是160毫秒左右,極大減少了多次磁盤I/O的時間,提高了文件的讀取效率。
[0068]為了將本發(fā)明提供的文件存取方法和原生的HDFS對磁盤的利用率進行對比,每天存儲15萬個小文件進行實驗,設(shè)置數(shù)據(jù)持久化的時間間隔為一天,若是在一天之內(nèi)數(shù)據(jù)沒有被訪問,則表明該數(shù)據(jù)要做持久化存儲,而實際環(huán)境中則需要根據(jù)以往經(jīng)驗進行設(shè)置;圖10記錄的是連續(xù)五天兩個存儲方案的數(shù)據(jù)增長趨勢;
[0069]從圖10可以看出,隨著時間的變化,采用原生的HDFS存儲的數(shù)據(jù)增長速度很快,而本發(fā)明提供的文件存取方法存儲數(shù)據(jù)的增長速度非常緩慢,本發(fā)明提供的文件存取方法的存儲方式是將向文件合并存儲,同時將不經(jīng)常被訪問的數(shù)據(jù)進行壓縮式存儲,極大地節(jié)省磁盤空間。
【主權(quán)項】
1.一種基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu),其特征在于,所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)包括數(shù)據(jù)緩存區(qū)、數(shù)據(jù)活躍區(qū)和數(shù)據(jù)永久區(qū);其中數(shù)據(jù)活躍區(qū)位于數(shù)據(jù)緩存區(qū)和數(shù)據(jù)永久區(qū)之間。2.根據(jù)權(quán)利要求1所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu),其特征在于,所述的數(shù)據(jù)緩存區(qū)位于每個數(shù)據(jù)節(jié)點的節(jié)點內(nèi)存中,采用Redis內(nèi)存數(shù)據(jù)庫做緩存,且各數(shù)據(jù)節(jié)點的Redis數(shù)據(jù)庫之間自建集群,用于存儲小文件的索引和緩存數(shù)據(jù)預(yù)取機制的文件。3.根據(jù)權(quán)利要求1所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu),其特征在于,所述的數(shù)據(jù)活躍區(qū)屬于HDFS的數(shù)據(jù)節(jié)點的數(shù)據(jù)存儲區(qū),用于存儲在活躍區(qū)內(nèi)的文件數(shù)據(jù)。4.根據(jù)權(quán)利要求1所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu),其特征在于,所述的數(shù)據(jù)永久區(qū)屬于HDFS的數(shù)據(jù)節(jié)點的數(shù)據(jù)存儲區(qū),并采用數(shù)據(jù)塊的壓縮式存儲方式對數(shù)據(jù)進行存儲。5.—種如權(quán)利要求1所述的基于NoSQL的海量航空物流小文件存儲結(jié)構(gòu)的文件存取方法,其特征在于,所述的文件存取方法包括文件存儲、文件訪問和文件永久化處理三個過程。6.根據(jù)權(quán)利要求5所述的文件存取方法,其特征在于,所述的文件存儲過程包括按順序進行的下列步驟: 步驟I):將海量的小文件批量的讀取到Redis內(nèi)存中,解析小文件,將文件的航班號和文件類型提取出來; 步驟2):將提取出的文件航班號、文件類型和文件一起批量的存儲到數(shù)據(jù)緩存區(qū)的Redis緩存中,并利用Redis的客戶端分片功能來擴展寫的性能; 步驟3):將一次航班的業(yè)務(wù)性報文和非業(yè)務(wù)性報文分別聚集起來,并將它們加入文件合并進程,在數(shù)據(jù)緩存區(qū)的Redi s緩存中建立每個小文件的索引,在合并的文件中建立內(nèi)部索引,將文件在大文件中的偏移量返回給Redis; 步驟4):將合并好的文件提交至HDFS客戶端,將文件存儲到HDFS上。7.根據(jù)權(quán)利要求5所述的文件存取方法,其特征在于,所述的文件訪問過程包括按順序進行的下列步驟: a、接收應(yīng)用程序的文件訪問請求,再將請求提交給Redi s客戶端; b、在數(shù)據(jù)緩存區(qū)的Redis數(shù)據(jù)庫中搜索要讀取的文件,如果能找到,立即將報文反饋給應(yīng)用程序,并結(jié)束訪問,否則進入步驟c; C、在Redis數(shù)據(jù)庫中搜索文件索引表,找到要讀取的文件對應(yīng)的索引,根據(jù)索引找到在HDFS上存儲的位置; d、據(jù)步驟c查找的文件索引,解析文件索引中讀取的文件是否已經(jīng)持久化,若沒有持久化,生成一條文件讀取命令提交給HDFS的客戶端,從HDFS上讀取想要的文件,否則進入步驟e; e、向HDFS的客戶端提交一個數(shù)據(jù)塊解壓縮命令,將要訪問的數(shù)據(jù)塊從數(shù)據(jù)永久級解壓縮成數(shù)據(jù)活躍級; f、從HDFS讀取想要的文件,并轉(zhuǎn)存到數(shù)據(jù)緩存區(qū)的Redis數(shù)據(jù)庫中,并將文件反饋給應(yīng)用程序; g、數(shù)據(jù)預(yù)存機制被觸發(fā),根據(jù)上一時刻讀取文件在數(shù)據(jù)塊中的偏移量,通過數(shù)據(jù)塊內(nèi)部索引確定要預(yù)取的數(shù)據(jù)的偏移量和長度,將數(shù)據(jù)發(fā)送到數(shù)據(jù)緩存區(qū)并存儲到Redis。8.根據(jù)權(quán)利要求5所述的文件存取方法,其特征在于,所述的文件永久化處理過程包括按順序進行的下列步驟: 1)永久化監(jiān)視器向Redis客戶端提交一次統(tǒng)計查詢,將屬于同一數(shù)據(jù)塊的文件做一次統(tǒng)計,判斷這一數(shù)據(jù)塊的文件的上一次訪問時間是否都超過了設(shè)定的永久化時間,沒有超過繼續(xù)監(jiān)視,否則進入步驟2); 2)向HDFS的客戶端提交一次數(shù)據(jù)塊永久化任務(wù); 3)HDFS客戶端接到數(shù)據(jù)永久化任務(wù),針對這些數(shù)據(jù)塊進行一次壓縮,將這些數(shù)據(jù)從數(shù)據(jù)活躍區(qū)轉(zhuǎn)移到數(shù)據(jù)永久區(qū)。
【文檔編號】G06F17/30GK105975638SQ201610481858
【公開日】2016年9月28日
【申請日】2016年6月23日
【發(fā)明人】丁建立, 鄭峰弓, 李永華, 李國 , 王懷超
【申請人】中國民航大學(xué)