Hadoop块大小和文件大小问题?

时间:2012-07-06 20:00:06

标签: hadoop hdfs

这可能看起来是一个愚蠢的问题,但在Hadoop中假设blocksize是X(通常是64或128 MB)而本地文件大小是Y(其中Y小于X)。现在当我将文件Y复制到HDFS时它会消耗一个块或者hadoop会创建更小的块吗?

1 个答案:

答案 0 :(得分:22)

Hadoop消耗了一个块。这并不意味着存储容量将以相同的方式消耗。

从Web浏览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程序时,它会尝试为每个块生成mapper,因此在这种情况下,当你处理三个小文件时,最终可能会产生三个映射器来处理它们。 当文件较小时,这会浪费资源。您还会增加延迟,因为每个映射器需要时间来生成,然后最终将在非常小的文件上工作。您必须将它们压缩到更接近块大小的文件中,以利用处理较少数量文件的映射器。

许多小文件的另一个问题是它加载了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