張 璐 楊東芳
(1.駐馬店職業(yè)技術學院信息工程系,河南 駐馬店463000;2.黃河交通學院機電工程學院,河南 焦作454950)
隨著計算機科學技術的飛速發(fā)展,信息逐漸被數(shù)據(jù)化,海量小文件的存儲給系統(tǒng)帶來巨大的壓力。首先文件系統(tǒng)在存儲小文件時需要反復請求存儲的地址,分配存儲空間,海量的小文件一起存儲就會占用服務器的內(nèi)存從而超出計算機硬件的極限;其次,海量小文件的存儲使檢索效率降低?,F(xiàn)有的存儲系統(tǒng)由于內(nèi)存的現(xiàn)狀,當存放文件積累到一定數(shù)量,就沒法做到有效管理,從而導致檢索效率降低,甚至導致系統(tǒng)崩潰。因此,解決小文件訪問性能瓶頸的問題越來越迫切。
結(jié)構(gòu)化存儲是在數(shù)據(jù)庫中將小文件整合成一個大文件一次性寫入,將小文件的內(nèi)容作為二進制字符串的大字段存入數(shù)據(jù)庫中,由于每個字段都是固定的,而小文件則是在一定范圍內(nèi)變化的,為了保證數(shù)據(jù)不因字段長度不夠而丟失,故在設計數(shù)據(jù)庫時會將字段設計得相對比較大,這樣就使小文件內(nèi)容的存儲占據(jù)了大量的空白數(shù)據(jù),造成磁盤資源的浪費,也會使數(shù)據(jù)庫在進行I/O操作時操作時間變長[1]。
歸檔文件是將文件合并后放入文件存檔設備,在文件系統(tǒng)上創(chuàng)建一個文件系統(tǒng)進行工作,雖然采用創(chuàng)建歸檔文件來處理小文件能夠降低內(nèi)存的使用效率,但創(chuàng)建歸檔文件的同時會創(chuàng)建一個副本,需要同樣大小的磁盤空間,而且一旦創(chuàng)建后,歸檔文件就不能再改變,所以要增加或刪除文件時必須重新創(chuàng)建文件。
在分布式文件系統(tǒng)上設計一個小文件優(yōu)化器,將小文件在優(yōu)化器中進行合并,并且建立索引,這樣所有操作都在優(yōu)化器中完成,而大文件直接存儲在文件系統(tǒng),雖然避免了海量小文件存儲的麻煩,但如果小文件索引多到無法估計,就對優(yōu)化器磁盤的容量提出挑戰(zhàn)。
構(gòu)建結(jié)構(gòu)體是將相同擴展名的小文件進行合并,元數(shù)據(jù)存儲于結(jié)構(gòu)體的成員中,通過建立結(jié)構(gòu)體中各文件間的存儲索引[2]。訪問時只需讀取要查找文件的擴展名,然后訪問名稱節(jié)點,名稱節(jié)點根據(jù)該擴展名返回一個索引塊列表;最后用戶根據(jù)這個塊列表訪問相應的數(shù)據(jù)結(jié)構(gòu)體,在數(shù)據(jù)結(jié)構(gòu)體中根據(jù)元數(shù)據(jù)進行截取,查找到原先的小文件進行截取并返回。雖然將多個小文件合并成一個大文件的方案能使原先小文件占用的名稱節(jié)點服務器的內(nèi)存成倍數(shù)地降低,但是由于結(jié)構(gòu)體在定義時已經(jīng)設定了成員的大小,所以對于同類型但大小不一的小文件,傳統(tǒng)的合并方法會浪費大量的存儲空間。
在歸檔文件方法和文件優(yōu)化器處理思想的基礎上進行改進,能夠使文件優(yōu)化器的功能由傳統(tǒng)的結(jié)構(gòu)化數(shù)據(jù)庫來實現(xiàn)。數(shù)據(jù)庫能存儲海量塊小的元數(shù)據(jù),能快速建立索引,檢索速度比較快;而分布式文件系統(tǒng)可以多個存儲磁頭并行讀寫,文件的存儲和讀取帶寬較大,能夠突破數(shù)據(jù)庫存取的I/O瓶頸問題。文件系統(tǒng)與數(shù)據(jù)庫系統(tǒng)各盡其能,彌補了對方的不足[3-4]。由于實時存儲系統(tǒng)在這一時刻和下一時刻傳入的文件類型可能不同,不屬于同一個業(yè)務,可以根據(jù)他們不同的訪問字段來對部分常用字段建立非聚集索引,在不過分影響插入效率的前提下提高用戶查找文件的速度。
在合并文件時需要創(chuàng)建文件頭,記錄大文件中包含的小文件個數(shù)以及每個小文件的大小,并且與小文件放置在同一塊大緩存內(nèi),在數(shù)據(jù)庫中記錄文件的元數(shù)據(jù)信息及相應的大文件和在大文件中的具體位置,與構(gòu)建結(jié)構(gòu)體進行文件合并的方法相比,創(chuàng)建文件頭的合并機制更適合于文件大小有變動的海量小文件的合并,在進行文件讀取時通過查詢數(shù)據(jù)庫來獲取文件的邏輯地址并且對文件進行訪問。
首先,創(chuàng)建一個PingFile的類,其中包括:Name:大文件的文件名稱;size[count]:用于記錄每個小文件的大?。?addr[count]:用于記錄每個小文件的內(nèi)存地址;timecount:用于記錄當前PingFile存在的時間;current:用于記錄當前狀態(tài)傳入的參數(shù),要求存入PingFile的相對位置。count表示大文件中小文件數(shù)量的上限,timelimit表示等待時間的上限,當?shù)却龝r間或數(shù)量達到上限時,開啟線程將PingFile中小文件的緩存按照表1的結(jié)構(gòu)形式合并為一個大緩存并存入到文件系統(tǒng)中,提交本次數(shù)據(jù)庫的事務,完成一次小文件的合并及其元數(shù)據(jù)的入庫。程序接收到傳入的小文件,根據(jù)傳入的相關參數(shù)將文件塊存入大的緩存區(qū)內(nèi),并將小文件在大文件中的相對位置和大文件的命名作為元數(shù)據(jù),放在數(shù)據(jù)庫事務中,以便保持數(shù)據(jù)庫和文件系統(tǒng)的一致性,然后繼續(xù)等待下一文件的傳入。當緩存區(qū)的文件達到合成條件時,將緩存塊生成數(shù)據(jù)文件存放在文件系統(tǒng)中,數(shù)據(jù)庫再次提交事務(見表1)。
表1 大文件緩存結(jié)構(gòu)
在讀取文件時,首先根據(jù)查找信息在數(shù)據(jù)庫中查找相應的數(shù)據(jù)條目,如果找不到就直接返回,如果找到就遍歷所有的結(jié)果集,找到大文件的地址以及小文件在大文件中的相對位置,然后對大文件進行解析,根據(jù)小文件的存儲位置在緩存中取出小文件并返回給用戶,完成文件的讀取操作。
表2 合并文件個數(shù)與合并、讀取時間關系表
圖1 合并文件個數(shù)與合并、讀取時間關系圖
使用本地文件系統(tǒng)將300個不同的圖形文件(32KB至512KB不等)進行合并,之后對其進行逐一讀取,最后得到的圖形文件與原文件完全相同,其可行性得到了驗證。表2為512KB大小不同數(shù)目的小文件合并讀取的時間對比(時間為十次測試的平均值,每次讀取的是第30個小文件)。從圖1可以看出,合并與讀取所用時間基本和合并個數(shù)呈線性關系。
針對文件系統(tǒng)實時存儲海量小文件不方便,提出了基于數(shù)據(jù)庫的小文件合并方法,即對大量小文件的數(shù)據(jù)進行批量處理,在保證存取前后系統(tǒng)的穩(wěn)定性和文件正確性的前提下,大幅度提高了文件系統(tǒng)對小文件存儲效率。通過文件系統(tǒng)與數(shù)據(jù)庫的結(jié)合,解決了文件系統(tǒng)的檢索瓶頸和數(shù)據(jù)庫I/O瓶頸問題,減少了存儲時間。但是需要指出的是,由于進行了文件合并,如果要對單個小文件進行修改操作,則需要對大文件中的片段進行解析、擴展或者縮減,會造成單個小文件更新操作的不方便。所以,該方法適用于量多塊小、時間分布均勻且更新頻度較小的數(shù)據(jù)倉庫類的工作業(yè)務流程。
[1]江柳.HDFS下小文件存儲優(yōu)化相關技術研究[D],北京郵電大學,2010.
[2]http://hadoop.apache.org/mapreduce/docs/r0.21.0/hadoopp_archives.html.
[3]劉小俊,徐正全,潘少明.一種結(jié)合RDBMS和Hadoop的海量小文件存儲方法[J].武漢大學學報,2013(1):27-31.
[4]泰冬雪.基于Hadoop的海量小文件處理方法的研究[D].遼寧大學,2011.