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