(翻譯)Hadoop中合並小文件


本文翻譯自如下網址: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM