如果我的mapreduce作业读取目录中每1 mb大小可用的60个文件,那么将执行多少Mapper。让我们假设在这个/ user / cloudera / inputs /目录下有60个文件,每个文件的大小是1 mb
在我的mapreduce配置类中,我指定了目录/ user / cloudera / inputs /.
有人可以告诉我有多少块用于存储每个1 mb大小的60个文件以及执行了多少个映射器
它是60块和60个映射器吗?如果是这样有人解释我是如何
答案 0 :(得分:0)
Map任务通常一次处理一个输入块(使用默认的FileInputFormat)。如果文件很小并且有很多文件,那么每个地图任务处理的输入都很少,而且还有更多的地图任务,每个任务都会增加额外的簿记开销。将1GB文件分成16个64MB块和10,000个左右100KB文件。 10,000个文件各使用一个映射,作业时间比单个输入文件的等效数据慢几十或几百倍。
In your case 60 map are used in 60 files and used 60 blocks.
如果你正在使用类似TextInputFormat的东西,问题是每个文件至少有1个分割,所以地图数量的上限是文件的数量,在你的情况下,你有很多非常小的文件最终会有许多映射器处理每个非常少的数据。
要解决这个问题,你应该使用CombineFileInputFormat,它将多个文件打包到同一个分区中(我想到了块大小限制),所以使用这种格式,映射器的数量将独立于文件的数量,它将仅取决于数据量。
您必须通过从CombineFileInputFormt扩展来创建自己的输入格式,您可以找到实现here。一旦你定义了你的InputFormat,让我们在链接CombinedInputFormat中调用它,你可以通过这样做告诉你的工作使用它:
job.setInputFormatClass(CombinedInputFormat.class);