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

Sla*_*yer 7 hadoop hdfs

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

pyf*_*unc 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
Run Code Online (Sandbox Code Playgroud)

您会看到每个文件大小都小于128 MB的块大小.这些文件以KB为单位.根据实际文件大小消耗HDFS容量,但每个文件消耗一个块.

可用的块数量有限,具体取决于HDFS的容量.在使用所有实际存储容量之前,您将耗尽块,因为您将耗尽它们.请记住,Unix filsystem也有块大小的概念,但是512字节的数字非常小.这个概念在HDFS中被反转,其中块大小保持在64-128 MB左右.

另一个问题是,当你运行的map/reduce程序,它会尝试在这种情况下产卵每块的映射,所以当你正在处理三个小文件,它可能最终会产卵3名映射器对他们的最终奏效.当文件较小时,这会浪费资源.您还会增加延迟,因为每个映射器需要时间来生成,然后最终将在非常小的文件上工作.您必须将它们压缩到更接近块大小的文件中,以利用处理较少数量文件的映射器.

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