2012-07-06 282 views
5

這似乎是一個愚蠢的問題,但在Hadoop中,假設blocksize是X(通常爲64或128 MB),本地文件大小是Y(其中Y小於X)。現在,當我將文件Y複製到HDFS時,一塊或將hadoop創建更小的塊?Hadoop塊大小和文件大小問題?

回答

18

Hadoop消耗了一個塊。這並不意味着存儲容量將以相同的方式消耗。

而從網頁瀏覽HDFS的輸出是這樣的:

filename1 file 48.11 KB 3 128 MB 2012-04-24 18:36  
filename2 file 533.24 KB 3 128 MB 2012-04-24 18:36  
filename3 file 303.65 KB 3 128 MB 2012-04-24 18:37 

你看到每個文件大小小於塊大小爲128 MB較小。這些文件以KB爲單位。 根據實際文件大小消耗HDFS容量,但每個文件消耗一個塊。

根據HDFS的容量,可用塊的數量是有限的。在利用所有實際的存儲容量之前,您將耗盡塊,因爲您將耗盡塊。請記住,Unix filsystem也有塊大小的概念,但是大小約爲512字節。這個概念在HDFS中反轉,其中塊大小保持在64-128 MB左右。

另一個問題是,當你運行map/reduce程序時,它會嘗試爲每個塊生成映射器,因此在這種情況下,當你處理三個小文件時,最終可能會產生三個映射器來處理它們。 當文件尺寸較小時,這會浪費資源。您還會添加延遲,因爲每個映射器都需要花費時間才能產生,然後最終會在非常小的文件上運行。您必須將它們壓縮到更接近塊大小的文件中,以利用映射器處理較少數量的文件。

許多小文件的另一個問題是它加載了namenode,它將每個塊的映射(元數據)和塊映射保存在主內存中。對於較小的文件,您可以更快地填充此表,並且隨着元數據的增長需要更多的主內存。

閱讀參考如下:

  1. http://www.cloudera.com/blog/2009/02/the-small-files-problem/
  2. http://www.ibm.com/developerworks/web/library/wa-introhdfs/
  3. 哦!有關於SO的討論:Small files and HDFS blocks