如果我的mapreduce作业读取了60个文件,每个文件的大小为1mb,那么将执行多少映射器。假设在这个/user/cloudera/inputs/目录下有60个文件,每个文件的大小是1mb
在我的mapreduce配置类中,我指定了目录/user/cloudera/inputs/。
有人能告诉我有多少块用于存储每1mb大小的60个文件吗?执行了多少映射器吗
是60块和60个映射器吗?如果是这样的话,有人向我解释是如何
Map任务通常一次处理一个输入块(使用默认的FileInputFormat)。如果文件很小,而且有很多,那么每个地图任务处理的输入很少,而且有更多的地图任务,每个任务都会带来额外的记账开销。将1GB的文件分成16个64MB的块,与10000个100KB左右的文件进行比较。10000个文件每个使用一个映射,作业时间可能比使用单个输入文件的等效文件慢几十倍或数百倍。
In your case 60 map are used in 60 files and used 60 blocks.
如果您使用的是像TextInputFormat这样的东西,问题是每个文件至少有一个分割,所以映射数量的上限是文件数量,在您有许多非常小的文件的情况下,最终会有许多映射器处理每一个非常小的数据。
为了解决这个问题,您应该使用CombineFileInputFormat,它将把多个文件打包到同一个分割中(我认为这达到了块大小的限制),因此使用这种格式,映射器的数量将与文件的数量无关,它将只取决于数据量。
您必须通过从CombineFileInputFormt扩展来创建自己的输入格式,您可以在这里找到实现。定义了InputFormat后,让我们像在链接CombinedInputFormat中那样称它,您可以通过以下操作告诉您的工作使用它:
job.setInputFormatClass(CombinedInputFormat.class);