MapReduce中的mapper和reducer任务数

时间:2015-09-17 17:22:01

标签: hadoop mapreduce

如果我将reduce任务的数量设置为100,并且当我运行作业时,假设reduce任务数超过(根据我的理解,reduce任务的数量取决于我们得到的键值来自mapper.Suppose我将(1,abc)(2,bcd)设置为mapper中的关键值,reduce任务的数量将是2)MapReduce将如何处理它?。

2 个答案:

答案 0 :(得分:1)

  

根据我的理解,减少任务的次数取决于我们从映射器获得的键值

您的理解似乎是错误的。减少任务的数量不依赖于我们从映射器获得的键值。 在MapReduce作业中,reducers的数量可以基于每个作业进行配置,并在驱动程序类中设置。

例如,如果我们需要2个减速器,那么我们需要在MapReduce作业的驱动程序类中设置它,如下所示: -

job.setNumReduceTasks(2);
  

在Hadoop:The Definitive Guide一书中,Tom White表示 -   设置减速器数量是一种艺术,而不是科学。

因此,我们必须决定工作所需的减速器数量。对于您的示例,如果您将中间Mapper输入为(1,abc)和(2,bcd)并且您没有在驱动程序类中设置reducer的数量,那么Mapreduce默认只运行1个reducer和两个键值对将由单个Reducer处理,您将在指定的输出目录中获得单个输出文件。

答案 1 :(得分:0)

  

MapReduce 上的reducer数量的默认值为 1 ,与(键,值)对的数量无关。

  

如果为 MapReduce 作业设置Reducer的数量,则无论不同(键,值)对的数量如何,Reducer的数量都不会超过定义的值。

完成Mapper任务后,Partitioner将数据分成Reducers处理输出。 hadoop的默认分区程序是HashPartitioner,它根据键的哈希值对数据进行分区。它有一个名为getPartition的方法。它需要key.hashCode() & Integer.MAX_VALUE并使用modulus找到number of reduce tasks

因此,减速器的数量永远不会超过您在Driver类中定义的数量。