这可能看起来是一个愚蠢的问题,但在Hadoop中假设blocksize是X(通常是64或128 MB)而本地文件大小是Y(其中Y小于X)。现在当我将文件Y复制到HDFS时它会消耗一个块或者hadoop会创建更小的块吗?
答案 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,它保存了每个块的映射(元数据)和主存储器中的块映射。对于较小的文件,您可以更快地填充此表,并且随着元数据的增长将需要更多的主内存。
阅读以下内容以供参考: