版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。html
Hadoop自己也提供了幾個解決方案,分別爲:Hadoop Archive,Sequence file和CombineFileInputFormat。node
Hadoop Archive或者HAR,是一個高效地將小文件放入HDFS塊中的文件存檔工具,它可以將多個小文件打包成一個HAR文件,這樣在減小namenode內存使用的同時,仍然容許對文件進行透明的訪問。算法
(1) 對某個目錄/foo/bar下的全部小文件存檔成/outputdir/ zoo.har:
hadoop archive -archiveName zoo.har -p /foo/bar /outputdir
固然,也能夠指定HAR的大小(使用-Dhar.block.size)。
(2) HAR的訪問路徑能夠是如下兩種格式:
har://scheme-hostname:port/archivepath/fileinarchive
har:///archivepath/fileinarchive(本節點)
能夠這樣查看HAR文件存檔中的文件:
hadoop dfs -ls har:///user/zoo/foo.har
輸出:
har:///user/zoo/foo.har/hadoop/dir1
har:///user/zoo/foo.har/hadoop/dir2
複製代碼
使用HAR時須要兩點,第一,對小文件進行存檔後,原文件並不會自動被刪除,須要用戶本身刪除;第二,建立HAR文件的過程其實是在運行一個mapreduce做業,於是須要有一個hadoop集羣運行此命令。數組
此外,HAR還有一些缺陷:第一,一旦建立,Archives便不可改變。要增長或移除裏面的文件,必須從新建立歸檔文件。第二,要歸檔的文件名中不能有空格,不然會拋出異常,能夠將空格用其餘符號替換(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement參數)。app
sequenceFile文件是Hadoop用來存儲二進制形式的[Key,Value]對而設計的一種平面文件(Flat File)。能夠把SequenceFile當作是一個容器,把全部的文件打包到SequenceFile類中能夠高效的對小文件進行存儲和處理。工具
SequenceFile文件並不按照其存儲的Key進行排序存儲,SequenceFile的內部類Writer提供了append功能。SequenceFile中的Key和Value能夠是任意類型Writable或者是自定義Writable。oop
在存儲結構上,SequenceFile主要由一個Header後跟多條Record組成,Header主要包含了Key classname,value classname,存儲壓縮算法,用戶自定義元數據等信息,此外,還包含了一些同步標識,用於快速定位到記錄的邊界。每條Record以鍵值對的方式進行存儲,用來表示它的字符數組能夠一次解析成:記錄的長度、Key的長度、Key值和value值,而且Value值的結構取決於該記錄是否被壓縮。性能
https://blog.csdn.net/bitcarmanlee/article/details/78111289
複製代碼
咱們基於Hadoop內置的CombineFileInputFormat來實現處理海量小文件,須要作的工做就很顯然了,以下所示:spa
實現一個RecordReader來讀取CombineFileSplit包裝的文件Block.net
繼承自CombineFileInputFormat實現一個使用咱們自定義的RecordReader的輸入規格說明類
處理數據的Mapper實現類
配置用來處理海量小文件的MapReduce Job
https://blog.csdn.net/flyfish778/article/details/47722551
複製代碼
引用: http://www.raincent.com/content-85-11297-1.html
複製代碼
由於工做中用到這個,總結成文,參考多維博客,均代表引用鏈接,內容粗鄙,勿怪!
秦凱新 於深圳