本文翻譯自如下網址:http://jugnu-life.blogspot.com/2013/01/merging-small-files-in-hadoop.html,如需轉載,請注明出處,謝謝!
在講述如何解決這個問題(小文件問題)之前,我們先總結一下問題是什么和它為什么會成為一個問題,如果你已經知道了其中的詳細情況,你可以直接跳到解決方法部分。
問題?
每一個比block size小的文件都會消耗掉一個完整block的分配,但是磁盤空間的實際占用是基於文件的大小,而不要誤認為小文件會消耗掉一整個塊的存儲空間。
每個塊都會消耗NameNode節點一定數量的內存。
NameNode能夠尋址固定數量的塊個數,這需要視NameNode節點的內存大小而定。
在Hadoop集群上的這些小文件會不斷觸及NameNode節點的內存限制。
很快問題就出現了,我們不能夠再給Hadoop集群添加數據了,因為NameNode已經沒有內存空間分配新的block了。
讓我用一個簡單的例子總結一下上面的問題。
我們有1000個小文件,每個小文件都是100KB。每個小文件都需要一個block來存儲。那么NameNode就需要給分配1000個block,然而實際上消耗的存儲空間只有1000*100KB(replication = 1)。
但是,如果我們將這些小文件合並為一個1000*100KB大小的文件,那么在NameNode上只會消耗一個block。
情況是NameNode需要將所有block的信息保存在內存中,因此和保存一個合並后的block信息不同的是,我們需要在NameNode的內存中消耗掉1000個block的空間。
解決方案
解決的方法相當直接明了,就是將小的文件合並為更大的文件以至於他們可以占滿一個block的大小。
我在下面列舉了一些解決辦法,你可以根據自己的需要進行選擇
1) HDFSConcat
如果文件都有相同的block size和復制因子,那么可以使用HDFS指定的API(HDFSConcat)將2個文件連接為一個文件,而且不需要復制塊。
http://svn.apache.org/repos/asf/hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/HDFSConcat.java
https://issues.apache.org/jira/browse/HDFS-222
2) IdentityMapper and IdentityReducer
使用IdentityMapper和IdentityReducer寫一個MR任務,但是會產生更少的輸出文件,可以通過設置reducers的個數來完成。
3) FileUtil.copyMerge
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileUtil.html#copyMerge
4) Hadoop File Crush
http://www.jointhegrid.com/hadoop_filecrush/index.jsp
Sample invocation
hadoop jar filecrush-2.0-SNAPSHOT.jar crush.Crush -Ddfs.block.size=134217728 \
--input-format=text \
--output-format=text \
--compress=none \
/path/to/my/input /path/to/my/output/merge 20100221175612
這里134217728是一個隨機的時間戳,可以表示為運行腳本的時間。
閱讀下面的文檔了解詳細的幫助,我也推薦用這個工具解決小文件的問題
http://www.jointhegrid.com/svn/filecrush/trunk/src/main/resources/help.txt
更多的參考可以查看:
http://stackoverflow.com/questions/11368907/hadoop-block-size-and-file-size-issue
http://blog.cloudera.com/blog/2009/02/the-small-files-problem/
http://www.ibm.com/developerworks/web/library/wa-introhdfs/
http://amilaparanawithana.blogspot.com.au/2012/06/small-file-problem-in-hadoop.html
http://www.quora.com/How-can-I-merge-files-in-HDFS
