HDFS小文件弊端:
HDFS上每個文件都要在namenode上建立一個索引,這個索引的大小約為150byte,這樣當小文件比較多的時候,就會產生很多的索引文件,一方面會大量占用namenode的內存空間,另一方面就是索引文件過大是的索引速度變慢。
解決的方式:
1:Hadoop本身提供了一些文件壓縮的方案
2:從系統層面改變現有HDFS存在的問題,其實主要還是小文件的合並,然后建立比較快速的索引。
Hadoop自帶小文件解決方案
1:Hadoop Archive:
是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣在減
少namenode內存使用的同時。
2:Sequence file:
sequence file由一系列的二進制key/value組成,如果為key小文件名,value為文件內容,則可以將大批
小文件合並成一個大文件。
3:CombineFileInputFormat:
CombineFileInputFormat是一種新的inputformat,用於將多個文件合並成一個單獨的split,另外,它會
考慮數據的存儲位置。
小文件優化(實戰經驗)
開啟Jvm重用對Job影響:hadoop集群機器配置:三台Ubnutu虛擬機,內存512M
文件數 文件大小 JVM重用 耗時 Jobid
4815 7.54 GB Y 32mins, 5sec job_201206161018_0004
4815 7.54 GB N 58mins, 49sec job_201206161018_0014
結論:對於大量小文件Job,開啟JVM重用減少45%運行時間
一個map運行一個jvm,重用的話,在一個map在jvm上運行完畢后,jvm繼續運行其他jvm
參數mapred.reduce.parallel.copies
任務時間 mapred.reduce.parallel.copies
54mins, 21sec 5(默認值)
48mins, 30sec 20
通過配置參數mapred.reduce.parallel.copies可以提升12%性能
優化項 優化方法 可以減少Job時間
Jvm重用 開啟jvm重用 45%
mapred.reduce.parallel.copies 默認值為5,優化值20 12%
解釋mapred.reduce.parallel.copies:
Reduce task在做shuffle時,實際上就是從不同的已經完成的map上去下載屬於自己這個reduce的部分數據,
由於map通常有許多個,所以對一個reduce來說,下載也可以是並行的從多個map下載,這個並行度是可以調
整的,調整參數為:mapred.reduce.parallel.copies(default 5)。默認情況下,每個只會有5個並行的下
載線程在從map下數據,如果一個時間段內job完成的map有100個或者更多,那么reduce也最多只能 同時下載
5個map的數據,所以這個參數比較適合map很多並且完成的比較快的job的情況下調大,有利於reduce更快的
獲取屬於自己部分的數據。