7

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

4

1 回答 1

23

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

大量小文件的另一个问题是它加载了 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 的讨论:小文件和 HDFS 块
于 2012-07-06T20:24:25.627 回答