hdfs上有4个文件
1.txt,2.txt,3.txt和4.txt。在这4个文件中,前3个文件的数据内容如下所示,4.txt文件为空。如何执行映射器。
映射器个数=输入分割的个数。
我的问题是,所有这些文件是存储在一个64 MB的块还是4个不同的块中?因为每个文件的数据大小都小于64MB。
1.txt文本文件1
这是文本文件2 这是文本文件34.三种"Empty"
它将存储在4个不同的块中,除非您将其打包并存储在HAR文件中。这个概念是,如果你的文件大小大于块大小,那么你的单个文件将被分割并存储在不同的块中,否则,如果它小于块大小,那么文件将独立存储在不同的块中。但是,即使块大小为64 MB或更大,它也不会使用超过实际文件大小的文件。引用自权威指南:
HDFS存储小文件效率不高,因为每个文件都存储在一个块中,而块元数据由namenode保存在内存中。因此,大量的小文件会占用namenode上的大量内存。
在你的例子中,它仍然会使用4个映射器因为我们有4个块
HDFS默认不将小文件合并到一个块中。HDFS将所有文件存储在单独的块中,因此您的HDFS将使用4block来存储您的4files(每个都小于dfs.block.size)。这并不意味着HDFS将占用4*64MB的大小。因此,您的MR作业将生成4个映射器来读取所有文件
理想情况下,你不应该在HDFS上存储小文件,因为它会增加Namenode的负载。
可以在上传到HDFS之前使用unix utility将文件合并,或者将文件转换为序列文件,或者编写pig script/hive script/mapreduce将所有小文件合并为大文件。HDFS上的小文件在这里有很好的描述:http://blog.cloudera.com/blog/2009/02/the-small-files-problem/