如果我将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
类中定义的。