MapReduce中mapper和reducer任务的数量



如果我将reduce任务的数量设置为类似100的东西,并且当我运行作业时,假设reduce任务的数量超过(根据我的理解,reduce任务的数量取决于我们从映射器获得的键值)。假设我将(1,abc)(2,bcd)设置为mapper中的键值,则reduce任务的数量将为2)MapReduce将如何处理?

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

你的理解似乎是错误的。 reduce任务的数量不依赖于我们从映射器获得的键值。在MapReduce作业中,reducer的数量可以在每个作业的基础上进行配置,并在driver类中进行设置。

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

job.setNumReduceTasks(2);

在《Hadoop:权威指南》一书中,Tom White指出-设置减速器计数是一种艺术,而不是科学。

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

MapReduce上的number of reducer的默认值是1,与(key,value)对的个数无关。

如果您为MapReduce作业设置了Reducer的个数,那么Reducer的个数将不会超过定义的值,而不管不同(键,值)对的个数。

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

所以reducer的数量永远不会超过你在Driver类中定义的。

相关内容

  • 没有找到相关文章

最新更新