朱永強(qiáng)++周珂++李丹++趙亞萌
DOI:10.16644/j.cnki.cn33-1094/tp.2016.09.003
摘 要: HDFS是一種高容錯(cuò)性的分布式系統(tǒng)。它支持的數(shù)據(jù)集在GB到TB級(jí)別,然而對(duì)大量小文件存取支持不足。由于在處理大數(shù)量級(jí)的小文件時(shí),會(huì)使得NameNode內(nèi)存消耗過度,造成文件的存取性能降低。因此提出了一種根據(jù)文件類型分類小文件的合并策略。通過建立索引信息服務(wù)器來存儲(chǔ)存放在用戶文件中的小文件的元數(shù)據(jù)信息,可以達(dá)到高效讀取小文件的目的。實(shí)驗(yàn)結(jié)果表明,該優(yōu)化策略能有效降低NameNode內(nèi)存消耗,提高HDFS文件系統(tǒng)對(duì)大量小文件讀取效率。
關(guān)鍵詞: HDFS; 小文件存??; 文件類型; 用戶文件; 元數(shù)據(jù)信息
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2016)09-09-04
HDFS small file read and write optimization strategy
Zhu Yongqiang1,2, Zhou Ke1,2, Li Dan1,2, Zhao Yameng2
(1. School of Computer and Information Engineering Henan University, Kaifeng, Henan 475004, China;
2. Institute of Remote Sensing and Digital Earth Chinese Academy of Sciences)
Abstract: HDFS is a kind of distributed system with high fault tolerance. It supports data set at the GB to the TB level, but lacks of support for the access to a large number of small files. The processing of large number of small files will make the NameNode memory consumption excessive, and result in a reduction of the file access performance. This paper presents a method of merging small files according to the file type. Through the establishment of an index information server to store the metadata of small files stored in the user files, the purpose of reading small files efficiently can be achieved. Experimental results show that the optimization strategy can effectively reduce the NameNode memory consumption, improve the reading efficiency of HDFS file system to a large number of small files.
Key words: HDFS; small file access; file type; user file; Metadata information
0 引言
隨著網(wǎng)絡(luò)和信息技術(shù)的不斷普及,人類產(chǎn)生的數(shù)據(jù)量正在呈指數(shù)級(jí)增長,大約每兩年翻一番,根據(jù)監(jiān)測,這個(gè)速度在2020年之前會(huì)繼續(xù)保持下去,這意味著人類在最近兩年產(chǎn)生的數(shù)據(jù)量相當(dāng)于之前產(chǎn)生的數(shù)據(jù)量總和。資料顯示,2011年,全球數(shù)據(jù)規(guī)模為1.8ZB,可以填滿575億個(gè)32GB的iPad,這些iPad可以在中國修建兩座長城。淘寶網(wǎng)網(wǎng)站每天有超過數(shù)千萬筆交易,單日產(chǎn)生數(shù)據(jù)量超過50TB,存儲(chǔ)量40PB(1PB等于1000TB)。百度公司存儲(chǔ)網(wǎng)頁數(shù)量接近1萬億頁,每天約處理60億次搜索請(qǐng)求,幾十PB數(shù)據(jù)[1]。云計(jì)算[2]已成為當(dāng)今研究的熱門課題,它很好的解決了大數(shù)據(jù)運(yùn)算與存儲(chǔ)的難題。HDFS是Apache Hadoop Core項(xiàng)目的一部分,現(xiàn)在已成為研究大數(shù)據(jù),實(shí)現(xiàn)云存儲(chǔ)服務(wù)的一個(gè)很好的模型[3],它是一個(gè)不錯(cuò)的分布式文件系統(tǒng),大部分的HDFS程序?qū)ξ募僮餍枰氖且淮螌懚啻巫x的操作模式[4]。它是一個(gè)主從結(jié)構(gòu),一個(gè)HDFS集群是由一個(gè)名字節(jié)點(diǎn)和多個(gè)數(shù)據(jù)節(jié)點(diǎn)組成,名字節(jié)點(diǎn)是一個(gè)管理文件命名空間和調(diào)節(jié)客戶端訪問文件的主服務(wù)器,數(shù)據(jù)節(jié)點(diǎn)用于存儲(chǔ)數(shù)據(jù)。HDFS采用的是流式讀取海量級(jí)數(shù)據(jù),然而它在文件存儲(chǔ)方面也有不足。這是由于HDFS是由單一NameNode多DataNode組成的,在集群運(yùn)行時(shí) NameNode的內(nèi)存中加載了命名空間的元數(shù)據(jù)信息,因此大量小文件的使用會(huì)造成節(jié)點(diǎn)的內(nèi)存消耗過多從而使系統(tǒng)的性能降低[5]。
社交網(wǎng)絡(luò)、電商平臺(tái)以及其他大數(shù)據(jù)領(lǐng)域每天都會(huì)產(chǎn)生大量的數(shù)據(jù)文件。據(jù)統(tǒng)計(jì)分析,郵件、文本、音樂、視頻、互聯(lián)網(wǎng)檔案、網(wǎng)站圖片等小于1M的海量小文件會(huì)占據(jù)整個(gè)集群小文件總數(shù)的90%以上。根據(jù)美國國家能源研究科學(xué)計(jì)算中心一個(gè)關(guān)于共享并行文件系統(tǒng)的研究顯示,該系統(tǒng)存儲(chǔ)的1300萬個(gè)文件中,99%的文件大小不超過64MB,43%的文件大小不超過64KB[6]。由于HDFS是面向大文件存儲(chǔ)與訪問而設(shè)計(jì)的,面對(duì)這些大量小文件的存在,NameNode元數(shù)據(jù)的檢索效率就會(huì)降低。本文提出了一種根據(jù)文件類型分類的小文件的合并策略,通過將不同類型的小文件的元數(shù)據(jù)信息存放在用戶文件的不同位置,從而實(shí)現(xiàn)將小文件合并為大文件,很好的解決了HDFS存取海量小文件效率低下的問題。
1 研究現(xiàn)狀以及存在的問題及分析
1.1 HDFS基本架構(gòu)
如圖1所示,HDFS是一個(gè)主/從(Mater/Slave)體系結(jié)構(gòu),HDFS集群擁有一個(gè)NameNode和多個(gè)DataNode。NameNode管理文件系統(tǒng)的元數(shù)據(jù),DataNode存儲(chǔ)實(shí)際的數(shù)據(jù)??蛻舳送ㄟ^同NameNode和DataNodes的交互訪問文件系統(tǒng)??蛻舳寺?lián)系NameNode以獲取文件的元數(shù)據(jù),而真正的文件I/O操作是直接和DataNode進(jìn)行交互的。
1.2 現(xiàn)有的小文件存取方案
HDFS能夠很好的支持大數(shù)據(jù)集的讀寫,提供很高的聚合帶寬,通常支持大數(shù)量級(jí)的文件(GB級(jí)別甚至更大的文件)[7],然而對(duì)小文件的支持卻有缺陷。主要原因在以下三個(gè)方面。
⑴ 由于HDFS文件系統(tǒng)命名空間中的元數(shù)據(jù)信息以及文件系統(tǒng)內(nèi)部配置數(shù)據(jù)都存放在一個(gè)叫做FSImage的文件中,每次集群啟動(dòng)時(shí)都會(huì)將這個(gè)文件加載到內(nèi)存中,若小文件數(shù)量巨大就會(huì)造成節(jié)點(diǎn)的內(nèi)存消耗過多。
⑵ HDFS文件系統(tǒng)默認(rèn)每一個(gè)block的大小為64MB,存儲(chǔ)在DataNode中。大文件可能跨越多個(gè)數(shù)據(jù)塊,理想情況下除了最后一個(gè)數(shù)據(jù)塊會(huì)產(chǎn)生磁盤碎片,其余都會(huì)寫滿。小文件容量一般小于數(shù)據(jù)塊的容量,多個(gè)文件存儲(chǔ)在一個(gè)數(shù)據(jù)塊,當(dāng)數(shù)據(jù)塊的碎片容量小于最小的文件大小時(shí),這些空間將得不到利用,造成空間浪費(fèi)。
⑶ 在頻繁的與客戶端交互過程中會(huì)形成大量的I/O操作,消耗在操作控制的時(shí)間遠(yuǎn)大于傳輸時(shí)間,造成網(wǎng)絡(luò)通信延時(shí)高,從而使HDFS的性能下降。
Hadoop本身提供了一種將小文件進(jìn)行歸檔的工具Hadoop Archives簡稱HAR Files,通過Hadoop的archive命令可以將大量小文件歸檔打包成一個(gè)HAR文件[8],因?yàn)樵L問HAR中的小文件要進(jìn)行兩次索引才能讀取到小文件。還有多NameNode架構(gòu),文件元數(shù)據(jù)信息存儲(chǔ)在多個(gè)NameNode節(jié)點(diǎn)上,需要采用映射文件來對(duì)NameNode進(jìn)行映射,如果映射文件較大時(shí)也會(huì)嚴(yán)重影響系統(tǒng)的性能?,F(xiàn)有的HDFS小文件解決方案都有著自身的不足。
2 基于文件合并策略的優(yōu)化方案
合并小文件是為了減少NameNode內(nèi)存消耗和提高其訪問性能。我們?cè)诩褐袨槊總€(gè)用戶建立一個(gè)用戶文件UserFile,該文件分成不同的文件類型區(qū)域(Part1、Part2…),利用HDFS提供的Append文件追加操作以流的形式將我們前面所提到的這些類型的小文件合并到用戶文件的不同區(qū)域中,這樣在HDFS集群中所表現(xiàn)出來的就是相當(dāng)于一個(gè)文件,有效降低了 NameNode 的內(nèi)存消耗。
2.1 小文件的存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)
我們提出了小文件的合并策略,采取了如圖2的架構(gòu)設(shè)計(jì)。HDFS應(yīng)用服務(wù)器封裝了對(duì)HDFS中文件的基本操作,用戶直接訪問HDFS應(yīng)用服務(wù)器就可以對(duì)HDFS集群中的文件進(jìn)行操作,此外還有一個(gè)小文件索引信息服務(wù)器,這個(gè)服務(wù)器主要是針對(duì)優(yōu)化小文件存儲(chǔ)用的。在進(jìn)行小文件的合并時(shí)需要記錄小文件在UserFile中的偏移值和文件的大小,文件索引信息服務(wù)器存儲(chǔ)了小文件的相關(guān)元數(shù)據(jù)信息并為其建立索引,從而提高了小文件的存取效率。
2.2 小文件優(yōu)化方案的實(shí)現(xiàn)
當(dāng)客戶端上傳文件,發(fā)出上傳請(qǐng)求,根據(jù)文件的大小,HDFS執(zhí)行不同的操作,對(duì)于大文件則直接上傳至HDFS文件系統(tǒng)中。設(shè)置小文件的閾值為1MB,如果文件的大小小于閾值,判斷小文件的類型,根據(jù)文件的類型將小文件以追加寫的方式寫到用戶文件的不同區(qū)域中。待小文件上傳完畢,我們將小文件的大小和偏移值記錄在小文件索引信息服務(wù)器上,以便用戶快速定位小文件,對(duì)小文件進(jìn)行讀取。
當(dāng)客戶端訪問文件時(shí),發(fā)出讀取文件請(qǐng)求,先判斷文件大小,若是大文件就直接從HDFS集群中讀取文件。如果小于設(shè)定的文件閾值,根據(jù)文件名稱和文件類型派生出的一個(gè)哈希函數(shù),此哈希函數(shù)H(key)的值均勻分布在哈希表中,哈希表將按文件類型分離許許多多的索引文件。哈希函數(shù)的作用是定位文件分類,找到文件索引,哈希代碼除以該類型小文件數(shù)得出一個(gè)值,根據(jù)這個(gè)值定位元數(shù)據(jù)文件中的index文件(類型文件),根據(jù)文件名稱從而定位到Part文件中文件實(shí)際位置,最后根據(jù)文件大小length以流式讀取文件。在實(shí)現(xiàn)的過程中,用到了一層索引,就定位到了小文件的實(shí)際位置[9]。由于小文件的數(shù)量龐大,用文件名稱和文件類型派生出的哈希函數(shù)檢索,效率會(huì)提升很多。根據(jù)文件類型對(duì)小文件進(jìn)行一次篩選,大大縮小了檢索的范圍,能夠快速地定位小文件的位置,達(dá)到快速讀取小文件的目的。
3 實(shí)驗(yàn)結(jié)果與分析
實(shí)驗(yàn)的硬件環(huán)境:DFS服務(wù)器,小文件索引信息服務(wù)器,名稱節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)。
實(shí)驗(yàn)的軟件環(huán)境:linux,Hadoop,JDK,Tomcat,Mysql。
我們用程序生成2000,5000,8000,10000,30000個(gè)不同類型的測試小文件,這些小文件的大小都是小于我們?cè)谇懊嬖O(shè)定的小文件閾值,平均大小為50KB。我們根據(jù)測試結(jié)果的平均值進(jìn)行測試數(shù)據(jù)的對(duì)比,包括改進(jìn)前和改進(jìn)后的HDFS架構(gòu)NameNode內(nèi)存消耗以及寫入文件和讀取文件的效率比較。
實(shí)驗(yàn)結(jié)果對(duì)比分析:由于改進(jìn)后的HDFS架構(gòu)的小文件元數(shù)據(jù)信息是存放在小文件索引服務(wù)器上,沒有存放到NameNode節(jié)點(diǎn)上,所以在集群啟動(dòng)時(shí),內(nèi)存并不會(huì)隨著文件的增多而占用過多內(nèi)存,如圖3所示。
從圖4可以發(fā)現(xiàn),在小文件數(shù)量小的時(shí)候,改進(jìn)后HDFS架構(gòu)文件上傳時(shí)間會(huì)比改進(jìn)前的時(shí)間長,這是由于改進(jìn)架構(gòu)后,對(duì)于小于文件閾值的小文件,我們根據(jù)文件類型的判斷,將文件以追加寫的方式寫到用戶文件的不同區(qū)域中,這樣會(huì)比改進(jìn)前直接添加元數(shù)據(jù)信息和文件所需要的時(shí)間會(huì)長一些。隨著小文件的數(shù)量趨向龐大,由于改進(jìn)的HDFS架構(gòu)的NameNode的內(nèi)存使用得到優(yōu)化,使得文件寫入的性能有所提升,但是優(yōu)化的性能不太明顯。
如圖5所示,改進(jìn)后的HDFS架構(gòu),讀取文件的速度顯著提高。這是由于改進(jìn)后的架構(gòu)中小文件是從索引服務(wù)器讀取其元數(shù)據(jù)信息、偏移值,由構(gòu)造的哈希函數(shù)所得值去定位用戶文件中的某個(gè)區(qū)域該小文件的具體位置,達(dá)到快速讀取小文件的目的。相比改進(jìn)前的架構(gòu),遍歷NameNode索引,檢索效率大大提升。
4 結(jié)束語
本文闡述了基于文件類型分類的小文件存儲(chǔ)架構(gòu),針對(duì)HDFS分布式文件系統(tǒng)在處理大量小文件時(shí)存在空間資源浪費(fèi)以及內(nèi)存消耗嚴(yán)重的問題,提出了一種根據(jù)文件類型分類的小文件合并策略。將小于文件閾值的小文件根據(jù)文件類型合并到一起,存放在用戶文件中。通過哈希函數(shù)提出一種新的索引策略,定位文件類型索引號(hào),再根據(jù)文件名稱定位文件位置。單層索引,可以將定位文件的位置最簡化,降低了檢索文件的索引時(shí)間。改進(jìn)后的HDFS架構(gòu),有效利用了磁盤空間資源以及解決了大量小文件元數(shù)據(jù)信息在NameNode節(jié)點(diǎn)上,造成內(nèi)存過度消耗的問題,提高了小文件的存取效率,優(yōu)化了系統(tǒng)的整體性能。
在實(shí)際運(yùn)行測試環(huán)境中,改進(jìn)后的小文件存儲(chǔ)架構(gòu),能很好地解決空間資源浪費(fèi)和內(nèi)存過度消耗的問題,但同時(shí)也存在一些缺點(diǎn)和不足,比如在文件上傳時(shí)需按照文件類型分區(qū)域存儲(chǔ)在用戶文件中,這樣會(huì)花費(fèi)HDFS一些時(shí)間。下一步將研究小文件寫入效率以及參數(shù)優(yōu)化問題,小文件存儲(chǔ)架構(gòu)也需要進(jìn)一步的設(shè)計(jì)和探討。通過優(yōu)化小文件存儲(chǔ)架構(gòu),內(nèi)存利用率仍有可能加以改善。對(duì)此,我們將在后續(xù)的工作中進(jìn)一步研究和完善。
參考文獻(xiàn)(References):
[1] 唐永建.“大數(shù)據(jù)”現(xiàn)狀及發(fā)展淺談[EB\OL].http://www.
zbeic.gov.cn/art/2013/12/9/art_2344_171250.html,2013.8.
[2] 劉鵬.云計(jì)算[M].電子工業(yè)出版社,2011.
[3] 張春明,芮建武,何婷婷.一種Hadoop小文件存儲(chǔ)和讀取的
方法[J].計(jì)算機(jī)應(yīng)用與軟件,2012.11.
[4] 馬建紅,張海.基于HDFS的小文件存儲(chǔ)與讀取優(yōu)化策略[J].
計(jì)算機(jī)系統(tǒng)應(yīng)用,2014.5.
[5] 陳光景.Hadoop小文件處理技術(shù)的研究與實(shí)現(xiàn)[D].南京郵電
大學(xué),2013.3.
[6] 周國安,李強(qiáng),陳新,胡旭.云環(huán)境下海量小文件存儲(chǔ)技術(shù)研究
綜述[J].信息網(wǎng)絡(luò)安全,2014.6.
[7] 陳劍,龔發(fā)根.一種優(yōu)化分布式文件系統(tǒng)的文件合并策略[J].
計(jì)算機(jī)應(yīng)用,2011.12.
[8] 蔡睿誠.基于HDFS的小文件處理與相關(guān)MapReduce計(jì)算
模型性能的優(yōu)化與改進(jìn)[D].吉林大學(xué),2012.4.
[9] 左大鵬,徐薇.基于Hadoop處理小文件的優(yōu)化策略[J].
SOFTWARE,2015.2.