小檔案是指那些size比hdfs的block size(預設64m)小的多的檔案。任何乙個檔案,目錄和bolck,在hdfs中都會被表示為乙個object儲存在namenode的記憶體中,每乙個object占用150bytes的記憶體空間。所以,如果有10milion個檔案,每乙個檔案對應乙個block,那麼就會消耗namenode 3g來儲存這些block的資訊。如果規模再大一點,那麼將會超出現階段計算機硬體所能滿足的極限。
控制小檔案的方法有:
1應用程式自己控制
2archieve
第一種是我採用的方法,感覺使用起來還是比較方便的,我的需求是要對幾千個檔案進行分布式運算,每個檔案占用的空間是2m左右,如果不進行合併的話,那樣子執行效率太低了,這裡我打算把50個小檔案合併為乙個大檔案放到hdfs系統裡面進行運算,**如下:
final file dir=new file(/home/user/mapinput");這樣,原本幾千個小檔案就變成了若干個100m左右的檔案了,檔案的大小可以通過引數num的數目來決定。int filename=0;
while(dir.listfiles().length!-0)
fileinputstream.close();
file f=new file("/home/user/mapinput/"+filename);
if(filename.exists())filename.delete();
mun++;
if(num==50)
} filename++;
create.close();
}
2使用archive來操作
hadoop不適合小檔案的儲存,小檔案本省就占用了很多的metadata,就會造成namenode越來越大。hadoop archives的出現視為了緩解大量小檔案消耗namenode記憶體的問題。
通過har來讀取乙個檔案並不會比直接從hdfs中讀檔案高效,而且實際上可能還會稍微低效一點,因為對每乙個har檔案的訪問都需要完成兩層讀取,index檔案的讀取和檔案本身的讀取,而且儘管har檔案可以被用來作為mapreduce job的input,但是並沒有特殊的方法來使maps將har檔案中打包的檔案當做乙個hdfs檔案處理。
命令:hadoop archive -archivename user.har -p /user output /user/har
檢視內容:hadoop fs -lsr har:///user/har/user.har
Hadoop優化及小檔案處理
hadoop本身也提供了幾個解決方案,分別為 hadoop archive,sequence file和combinefileinputformat。1 hadoop archive hadoop archive或者har,是乙個高效地將小檔案放入hdfs塊中的檔案存檔工具,它能夠將多個小檔案打包成...
Hadoop HDFS處理大量的小檔案 一
大量小檔案的缺點 1 占用namenode記憶體 2 處理時增加map任務數量,增加定址次數 1 使用har hadoop archives 構建在其他檔案系統之上用於檔案存檔的檔案系統 hadoop存檔檔案系統通常將hdfs中的多個檔案打包成乙個存檔檔案,減少namenode記憶體的使用 hado...
mapreduce關於大量小檔案的優化策略
在分布式的架構中,分布式檔案系統hdfs,和分布式運算程式程式設計框架mapreduce。hdfs 不怕大檔案,怕很多小檔案 mapreduce 怕資料傾斜 那麼mapreduce是如果解決多個小檔案的問題呢?mapreduce關於大量小檔案的優化策略 1 預設情況下,textinputformat...