宋繼紅,李夢楠,郝得智
摘? 要:從Hadoop分布式文件系統(tǒng)的架構(gòu)出發(fā),對NameNode節(jié)點(diǎn)存在的單點(diǎn)問題進(jìn)行了分析與研究。在這個(gè)前提下,針對單點(diǎn)內(nèi)存瓶頸問題,提出了一個(gè)小文件歸并算法。此算法以Hadoop為基礎(chǔ),利用Hadoop分布式文件系統(tǒng)的特點(diǎn),將歸并后生成的大文件序列化到Hadoop分布式文件系統(tǒng),很好地解決了小文件過多時(shí)NameNode單點(diǎn)內(nèi)存瓶頸問題,并提高了系統(tǒng)的性能和可靠性。
關(guān)鍵詞:Hadoop;小文件歸并;分布式文件系統(tǒng)
中圖分類號:TP393.0?????????? 文獻(xiàn)標(biāo)識碼:A
1?? 引言(Introduction)
如今網(wǎng)絡(luò)的飛速發(fā)展,數(shù)據(jù)量的增多,這就要求數(shù)據(jù)庫能夠具有處理超大規(guī)模數(shù)據(jù)的能力。Hadoop分布式平臺的出現(xiàn),很好地解決了處理海量數(shù)據(jù)的難題。Hadoop集群架構(gòu)有兩個(gè)核心的設(shè)計(jì),分別是HDFS(Hadoop Distributed File System)和MapReduce[1]。由于HDFS只有一個(gè)元數(shù)據(jù)服務(wù)器NameNode,導(dǎo)致HDFS存在單點(diǎn)故障,單點(diǎn)內(nèi)存不足等問題。本文在分析研究HDFS單點(diǎn)問題的基礎(chǔ)上,針對單點(diǎn)內(nèi)存瓶頸問題,提出了一種新型的上層歸檔文件系統(tǒng),用來優(yōu)化海量小文件的處理,可有效地解決單點(diǎn)內(nèi)存瓶頸問題。
2?? HDFS架構(gòu)(HDFS architecture)
Hadoop分布式文件系統(tǒng)(HDFS)是Hadoop分布式平臺的一個(gè)核心組件,其設(shè)計(jì)目的是為了解決超大文件存儲難題[2]。HDFS是由一個(gè)主節(jié)點(diǎn)和多個(gè)子節(jié)點(diǎn)構(gòu)成的主從結(jié)構(gòu)。主節(jié)點(diǎn)被稱為名稱節(jié)點(diǎn)(NameNode),子節(jié)點(diǎn)被稱為數(shù)據(jù)節(jié)點(diǎn)(DataNode)。HDFS的架構(gòu)圖如圖1所示。
圖1 HDFS架構(gòu)圖
Fig.1 The architecture diagram of HDFS
名稱節(jié)點(diǎn)主要負(fù)責(zé)管理分布式文件系統(tǒng)中的元數(shù)據(jù)信息,處理用戶文件訪問操作請求等。而被上傳到Hadoop分布式文件系統(tǒng)中的大數(shù)據(jù)則保存在數(shù)據(jù)節(jié)點(diǎn)中。通過心跳機(jī)制,每隔一段時(shí)間數(shù)據(jù)節(jié)點(diǎn)與名稱節(jié)點(diǎn)進(jìn)行信息交互[3]。
Hadoop分布式文件系統(tǒng)包含名稱節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、數(shù)據(jù)塊、數(shù)據(jù)包等組件。
名稱節(jié)點(diǎn)(NameNode)是HDFS的主節(jié)點(diǎn),負(fù)責(zé)管理并維護(hù)整個(gè)分布式文件系統(tǒng)的元數(shù)據(jù)信息,即:FSImage信息和EditLog信息[4]。NameNode又決定了大數(shù)據(jù)文件與數(shù)據(jù)塊之間的映射,數(shù)據(jù)塊與數(shù)據(jù)節(jié)點(diǎn)之間的映射,處理客戶端發(fā)來的文件操作訪問請求。
數(shù)據(jù)節(jié)點(diǎn)(DataNode)主要負(fù)責(zé)存儲數(shù)據(jù)文件,并且每隔一段時(shí)間向主節(jié)點(diǎn)發(fā)送存儲數(shù)據(jù)映射列表。
數(shù)據(jù)塊(Data Block)。分布式文件系統(tǒng)存儲的數(shù)據(jù)都存儲在數(shù)據(jù)塊中[5]。上傳的數(shù)據(jù)文件首先被分割成默認(rèn)大小64MB的數(shù)據(jù)塊,然后文件以數(shù)據(jù)塊的形式存放在不同的DataNode節(jié)點(diǎn)上,是分布式文件系統(tǒng)存儲數(shù)據(jù)的基本單位。為了防止數(shù)據(jù)塊丟失,每塊默認(rèn)復(fù)制三塊,其中兩個(gè)數(shù)據(jù)塊存儲在一個(gè)機(jī)架中,另一個(gè)數(shù)據(jù)塊則被存儲在其他的機(jī)架中,大大提高了HDFS數(shù)據(jù)的可用性。
數(shù)據(jù)包(Data Packet)。在執(zhí)行寫操作時(shí),需要將上傳的數(shù)據(jù)先保存在本地目錄中,待累計(jì)到系統(tǒng)規(guī)定值后才將數(shù)據(jù)一次寫入到Hadoop分布式文件系統(tǒng)中。這樣,每次上傳的數(shù)據(jù)稱為一個(gè)數(shù)據(jù)包。
3?? NameNode單點(diǎn)問題分析(NameNode single
point problem analysis)
3.1?? 單點(diǎn)故障
單點(diǎn)故障是指引起系統(tǒng)整體失效的部件,當(dāng)該部件失效時(shí),會造成整個(gè)系統(tǒng)無法工作。Hadoop分布式文件系統(tǒng)由一個(gè)主節(jié)點(diǎn)和多個(gè)子節(jié)點(diǎn)構(gòu)成的。NameNode節(jié)點(diǎn)負(fù)責(zé)管理和維護(hù)所有的命名空間和元數(shù)據(jù)信息,名稱節(jié)點(diǎn)主要負(fù)責(zé)管理分布式文件系統(tǒng)中的元數(shù)據(jù)信息,處理用戶文件訪問操作請求等。一旦發(fā)生主節(jié)點(diǎn)故障會使整個(gè)系統(tǒng)無法正常工作,這對于使用者來說是災(zāi)難性的。
3.2?? 性能瓶頸
NameNode節(jié)點(diǎn)主要負(fù)責(zé)管理并維護(hù)整個(gè)分布式文件系統(tǒng)的元數(shù)據(jù)信息,處理用戶文件訪問操作請求。每次用戶發(fā)出文件訪問操作請求時(shí),NameNode節(jié)點(diǎn)都需要響應(yīng)客戶端的請求[6]。由于HDFS僅有一個(gè)名稱節(jié)點(diǎn),當(dāng)大量客戶端同時(shí)發(fā)出文件訪問操作請求,單一的名稱節(jié)點(diǎn)無法及時(shí)一一做出響應(yīng),這必然會對HDFS正常運(yùn)行造成嚴(yán)重的影響,是HDFS的性能瓶頸。
3.3?? 內(nèi)存瓶頸
NameNode節(jié)點(diǎn)中保存了整個(gè)系統(tǒng)的命名空間,負(fù)責(zé)管理并維護(hù)整個(gè)分布式文件系統(tǒng)的元數(shù)據(jù)信息,即:FSImage信息和EditLog信息。對于每個(gè)上傳的文件,NameNode節(jié)點(diǎn)會為其自動(dòng)生成相應(yīng)的元數(shù)據(jù)信息,而這些元數(shù)據(jù)信息會占用少許的主節(jié)點(diǎn)內(nèi)存空間[7]。HDFS適合存儲大數(shù)據(jù)文件,一般情況下,NameNode節(jié)點(diǎn)存儲的元數(shù)據(jù)信息不會對整個(gè)Hadoop集群造成影響。上傳文件后,用戶更多的是與數(shù)據(jù)節(jié)點(diǎn)進(jìn)行訪問交互,不會對訪問性能造成影響。然而用戶選擇上傳海量的小文件時(shí),元數(shù)據(jù)節(jié)點(diǎn)需要為每個(gè)小文件生成對應(yīng)的元數(shù)據(jù)信息,這勢必對NameNode單點(diǎn)內(nèi)存性能造成影響,從而對整個(gè)Hadoop集群的擴(kuò)展性造成影響。一般,當(dāng)用戶上傳小文件數(shù)量達(dá)到一億,相應(yīng)的元數(shù)據(jù)信息約占主節(jié)點(diǎn)20G的存儲空間。若上傳的小文件以指數(shù)級增長,HDFS集群將不足以支持海量文件的存儲。同樣,NameNode內(nèi)存瓶頸嚴(yán)重制約了集群的擴(kuò)展。endprint
目前,Hadoop0.18.0版本引入了HAR(Hadoop archives)技術(shù),它可以將眾多小文件打包成一個(gè)大文件進(jìn)行存儲,減少HDFS中小文件數(shù)量,主要解決的是小文件占用大量Namenode內(nèi)存空間。但是它是一個(gè)人工干預(yù)的過程,同時(shí)既不能夠支持自動(dòng)刪除原小文件,也不支持追加操作,當(dāng)有新文件進(jìn)來以后,需要重新打包。還有一些針對具體問題的小文件解決方案,如WebGIS提出適用于地理信息系統(tǒng)信息存儲機(jī)制,和指定存儲格式為PPT格式的解決方案。這些解決方案可以有效解決HDFS單點(diǎn)內(nèi)存瓶頸問題[8],但均局限于指定的應(yīng)用環(huán)境,不適用其他類型文件的存儲,如海量存儲MP3格式的文件。
針對HDFS單點(diǎn)內(nèi)存瓶頸問題,本文提出了新型的上層歸檔文件系統(tǒng),用來優(yōu)化海量小文件的處理。
4? 對小文件存儲優(yōu)化的實(shí)現(xiàn)(Implementation of
small file storage optimization)
4.1?? 基本思想
上傳小文件前,首先對海量小文件進(jìn)行預(yù)處理,將本地目錄中需要處理的小文件寫入HashMap集合中,同時(shí)通過格式轉(zhuǎn)換生成文件流式集合,其中小文件文件名作為key,文件內(nèi)容作為value。然后以SequenceFile作為容器,再將HashMap中存儲的海量小文件進(jìn)行歸檔合并成一個(gè)大文件。最后,將合并后的大文件上傳Hadoop服務(wù)器序列化存儲在HDFS中,從而緩解了NameNode節(jié)點(diǎn)內(nèi)存瓶頸問題。處理海量小文件流程如圖2所示。
圖2 海量小文件處理
Fig.2 Massive small files processing
4.2?? SmallFilesWrite類的實(shí)現(xiàn)
SmallFilesWrite類中,成員變量有兩個(gè),就是String類型的靜態(tài)成員變量SOURCE_PATH和TARGET_PATH,SOURCE_PATH變量表示源路徑,即預(yù)上傳文件本地目錄路徑。TARGET_PATH表示目標(biāo)路徑,即上傳到指定Hadoop分布式文件系統(tǒng)路徑。成員方法主要有readFiles方法、file2Bytes方法和main方法。
(1)readFiles方法
上傳小文件前,首先對海量小文件進(jìn)行預(yù)處理,將本地目錄中需要處理的小文件寫入HashMap集合中,其中小文件文件名作為key,文件內(nèi)容作為value。
首先,在readFiles方法中創(chuàng)建一個(gè)File的對象directory,然后調(diào)用listFiles方法獲取SOURCE_PATH指定路徑中的文件的內(nèi)容。將獲取的文件存儲在創(chuàng)建的File[]數(shù)組中。最后map對象調(diào)用put方法,將讀取的小文件循環(huán)寫入到HashMap集合中。這里file[]數(shù)組元素調(diào)用getName方法獲取文件名,作為Map集合中的key,同時(shí)調(diào)用file2Bytes方法,將文件內(nèi)容作為Map集合中的value存儲。
(2)file2Bytes方法
在Hadoop分布式文件系統(tǒng)中,讀寫數(shù)據(jù)的方式滿足流式讀寫,目的可以提高數(shù)據(jù)訪問的吞吐量。為支持不同格式小文件合并,編寫了一個(gè)file2Bytes方法,該方法的形式參數(shù)為String類型的filename,這個(gè)參數(shù)代表本地目錄中預(yù)處理文件的文件名。創(chuàng)建FileInputStream對象fis,對其進(jìn)行初始化,并拋出異常。然后使用對象fis的available方法,目的使其可以不受阻塞地從此輸入流中讀?。ɑ蛱^)的估計(jì)剩余字節(jié)數(shù)。再然后定義一個(gè)byte類型的long_buf數(shù)組,將本地目錄中的小文件進(jìn)行格式轉(zhuǎn)換,轉(zhuǎn)換成字節(jié)流寫入long_buf數(shù)組中。這樣讀寫數(shù)據(jù)的方式滿足流式讀寫,同時(shí)解決了不同格式的小文件合并問題。
(3)main方法
main方法實(shí)現(xiàn)了將海量小文件進(jìn)行歸并處理,生成一個(gè)大文件,最后將其分布并發(fā)存儲到HDFS中。通過遍歷Map,迭代輸出集合中元素;創(chuàng)建Text對象key,BytesWritable對象value,key調(diào)用set方法獲取輸出集合中元素的key值,value調(diào)用set方法獲取拷貝的文件內(nèi)容,偏移量及文件長度;返回一個(gè)SequenceFile.Writer實(shí)例,這里需要?jiǎng)?chuàng)建FileSystem和Path對象,將數(shù)據(jù)內(nèi)容寫入path對象,調(diào)用append方法完成小文件的追加寫入。實(shí)現(xiàn)將海量小文件歸并處理,生成一個(gè)大文件。
4.3?? 文件的訪問
自定義一個(gè)FileOutputStream文件輸出流對象,指定輸出目錄將需要訪問的文件流式讀出,將讀出的文件返回給需要訪問的用戶。訪問某文件時(shí),首先獲取SmallFilesWrite中HDFS中輸入目錄,創(chuàng)建SequenceFile.Reader對象,通過迭代獲取序列文件名和該文件名所對應(yīng)的文件。
5?? 結(jié)論(Conclusion)
本文針對Hadoop分布式文件系統(tǒng)的單點(diǎn)內(nèi)存瓶頸問題,提出了采用小文件歸并的優(yōu)化算法。根據(jù)Hadoop存儲數(shù)據(jù)特點(diǎn),利用小文件合并大文件,可有效減少元數(shù)據(jù)的生成,解決了單點(diǎn)內(nèi)存瓶頸問題。在Hadoop分布式文件系統(tǒng)單點(diǎn)內(nèi)存瓶頸優(yōu)化的基礎(chǔ)上,對Hadoop分布式文件系統(tǒng)的性能瓶頸的優(yōu)化將是本人未來主要研究的內(nèi)容。
參考文獻(xiàn)(Reference)
[1] Tom White,Hadoop.周敏齊,等,譯.權(quán)威指南(第二版)[M].北
京:清華大學(xué)出版社,2011.
[2] Chuck Lam.Hadoop.韓冀中,譯.實(shí)戰(zhàn)[M].北京:人民郵電出版
社,2011.
[3] 雷萬云,等.云計(jì)算:技術(shù)、平臺及應(yīng)用案例[M].北京:清華大
學(xué)出版社,2011.
[4] The Apache Software Foundation HDFS ArchitectureGuide[EB/
OL].[2011-05-04].http://hadoop.apache.org/co-mmon/docs/
current/hdfs_design.html.
[5] DANIELN,RICH Wolski,CHRISG,etal.The Eucalyptus
OpenSource Cloud-Computing System[J].IEEE Computer
Society,2009,24(08):124-131.
[6] Venner J. Pro Hadoop[M]. New York:Apress,2009.
[7] Hadoop[EB/OL],http://hadoop.apache.org/.2011.
[8] Grant Mackey,Saba Sehrish,Jun Wang.Improving Metadata
Management for Small Files in HDFS[J].IEEE International
Conference on Cluster Computing and Workshops,2009:1-4.
作者簡介:
宋繼紅(1963-),女,碩士,副教授.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò)
通信,計(jì)算機(jī)網(wǎng)絡(luò)遠(yuǎn)程控制,嵌入式技術(shù).
李夢楠(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò).
郝得智(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)控制.endprint
[2] Chuck Lam.Hadoop.韓冀中,譯.實(shí)戰(zhàn)[M].北京:人民郵電出版
;?;?;?;?; 社,2011.
[3] 雷萬云,等.云計(jì)算:技術(shù)、平臺及應(yīng)用案例[M].北京:清華大
;?;?;?; 學(xué)出版社,2011.
[4] The Apache Software Foundation HDFS ArchitectureGuide[EB/
;?;?;?; OL].[2011-05-04].http://hadoop.apache.org/co-mmon/docs/
;?;?;?; current/hdfs_design.html.
[5] DANIELN,RICH Wolski,CHRISG,etal.The Eucalyptus
;?;?; OpenSource Cloud-Computing System[J].IEEE Computer
;?;?;?;?; Society,2009,24(08):124-131.
[6] Venner J. Pro Hadoop[M]. New York:Apress,2009.
[7] Hadoop[EB/OL],http://hadoop.apache.org/.2011.
[8] Grant Mackey,Saba Sehrish,Jun Wang.Improving Metadata
;?; Management for Small Files in HDFS[J].IEEE International
;?;?;?; Conference on Cluster Computing and Workshops,2009:1-4.
作者簡介:
宋繼紅(1963-),女,碩士,副教授.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò)
;?;?;?;?;?; 通信,計(jì)算機(jī)網(wǎng)絡(luò)遠(yuǎn)程控制,嵌入式技術(shù).
李夢楠(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò).
郝得智(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)控制.endprint
[2] Chuck Lam.Hadoop.韓冀中,譯.實(shí)戰(zhàn)[M].北京:人民郵電出版
;?;?;?;?; 社,2011.
[3] 雷萬云,等.云計(jì)算:技術(shù)、平臺及應(yīng)用案例[M].北京:清華大
;?;?;?; 學(xué)出版社,2011.
[4] The Apache Software Foundation HDFS ArchitectureGuide[EB/
;?;?;?; OL].[2011-05-04].http://hadoop.apache.org/co-mmon/docs/
;?;?;?; current/hdfs_design.html.
[5] DANIELN,RICH Wolski,CHRISG,etal.The Eucalyptus
;?;?; OpenSource Cloud-Computing System[J].IEEE Computer
;?;?;?;?; Society,2009,24(08):124-131.
[6] Venner J. Pro Hadoop[M]. New York:Apress,2009.
[7] Hadoop[EB/OL],http://hadoop.apache.org/.2011.
[8] Grant Mackey,Saba Sehrish,Jun Wang.Improving Metadata
;?; Management for Small Files in HDFS[J].IEEE International
;?;?;?; Conference on Cluster Computing and Workshops,2009:1-4.
作者簡介:
宋繼紅(1963-),女,碩士,副教授.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò)
;?;?;?;?;?; 通信,計(jì)算機(jī)網(wǎng)絡(luò)遠(yuǎn)程控制,嵌入式技術(shù).
李夢楠(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò).
郝得智(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)控制.endprint
[2] Chuck Lam.Hadoop.韓冀中,譯.實(shí)戰(zhàn)[M].北京:人民郵電出版
;?;?;?;?; 社,2011.
[3] 雷萬云,等.云計(jì)算:技術(shù)、平臺及應(yīng)用案例[M].北京:清華大
;?;?;?; 學(xué)出版社,2011.
[4] The Apache Software Foundation HDFS ArchitectureGuide[EB/
;?;?;?; OL].[2011-05-04].http://hadoop.apache.org/co-mmon/docs/
;?;?;?; current/hdfs_design.html.
[5] DANIELN,RICH Wolski,CHRISG,etal.The Eucalyptus
;?;?; OpenSource Cloud-Computing System[J].IEEE Computer
;?;?;?;?; Society,2009,24(08):124-131.
[6] Venner J. Pro Hadoop[M]. New York:Apress,2009.
[7] Hadoop[EB/OL],http://hadoop.apache.org/.2011.
[8] Grant Mackey,Saba Sehrish,Jun Wang.Improving Metadata
;?; Management for Small Files in HDFS[J].IEEE International
;?;?;?; Conference on Cluster Computing and Workshops,2009:1-4.
作者簡介:
宋繼紅(1963-),女,碩士,副教授.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò)
;?;?;?;?;?; 通信,計(jì)算機(jī)網(wǎng)絡(luò)遠(yuǎn)程控制,嵌入式技術(shù).
李夢楠(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò).
郝得智(1989-),男,碩士生.研究領(lǐng)域:計(jì)算機(jī)控制.endprint