HDFS需要為每個(gè)文件分片的副本維護(hù)元數(shù)據(jù),當(dāng)文件的體積過小,文件數(shù)目過多的情況下,會因元數(shù)據(jù)過多,給master節(jié)點(diǎn)帶來大量內(nèi)存開銷。然而將小文件存儲到hdfs的需求又常常有,hdfs本身也提供了一種解決方案,har打包。下文將會介紹這一方式的原理,并實(shí)現(xiàn)一個(gè)不使用mapreduce的本地打包程序。
1.HAR打包文件介紹
Har文件是一種HDFS可支持的打包方式,將小文件合并,并可以像普通hdfs文件一樣作為MapReduce輸入。


Har文件結(jié)構(gòu):是一個(gè)以”.har”結(jié)尾命名的目錄,其中有至少三個(gè)文件”_index”、”_masterindex”、”part-0”、……。其中”part-X”文件中直接拼接了原始文件內(nèi)容,無壓縮處理,每個(gè)map操作的節(jié)點(diǎn)生成一個(gè)”part-X”文件?!盻index”文件中存儲包內(nèi)目錄、文件的元數(shù)據(jù)信息,并按路徑j(luò)ava字符串hashCode()運(yùn)算的哈希值排序?!盻masterindex”記錄”_index”文件中每1000條信息的起止哈希值、在”_index”文件中起止位置。
Har文件的訪問:在使用Hadoop命令行工具時(shí),只有使用帶有har的schema文件路徑,就可以像普通hdfs文件一樣的使用。例如:./hadoopfs -cat
har:///pack1.har/Noname1.txt。
2.本地文件系統(tǒng)中打包Har文件實(shí)現(xiàn)
1、遍歷指定目錄下的所有目錄、文件,并將所有目錄、文件路徑j(luò)ava字符串hashCode()運(yùn)算的哈希值作為key,元數(shù)據(jù)作為value,存儲到一個(gè)TreeMap中。同時(shí)將文件內(nèi)容連接寫入同個(gè)文件”part-0”。
2、將排序的元數(shù)據(jù)信息,寫入”_index”文件,每1000條信息的起止哈希值、在”_index”文件中起止位置,記錄到”_masterindex”文件。
以上代碼,已經(jīng)沒有源碼了,請反編譯查看:http://pan.baidu.com/s/1geTiwKj