【发布时间】:2015-09-19 22:09:23
【问题描述】:
如果我将reduce 任务的数量设置为100 之类的东西,并且当我运行作业时,假设reduce 任务数超过(根据我的理解,reduce 任务的数量取决于我们从mapper.假设我在mapper中设置(1,abc)和(2,bcd)作为key值,reduce任务的数量将是2) MapReduce将如何处理?
【问题讨论】:
如果我将reduce 任务的数量设置为100 之类的东西,并且当我运行作业时,假设reduce 任务数超过(根据我的理解,reduce 任务的数量取决于我们从mapper.假设我在mapper中设置(1,abc)和(2,bcd)作为key值,reduce任务的数量将是2) MapReduce将如何处理?
【问题讨论】:
据我了解,reduce 任务的数量取决于我们从映射器获得的键值
你的理解似乎有误。reduce任务的数量并不取决于我们从mapper得到的key-value。 在 MapReduce 作业中,reducer 的数量可在每个作业的基础上进行配置,并在驱动程序类中设置。
例如,如果我们的作业需要 2 个 reducer,那么我们需要在 MapReduce 作业的驱动程序类中设置它,如下所示:-
job.setNumReduceTasks(2);
在 Hadoop: The Definitive Guide 一书中,Tom White 指出 - 设置减速器数量是一种艺术,而不是科学。
所以我们必须决定我们的工作需要多少个减速器。对于您的示例,如果您的中间 Mapper 输入为 (1,abc) 和 (2,bcd) 并且您没有在驱动程序类中设置减速器的数量,则 Mapreduce 默认仅运行 1 个减速器和两个键值对将由单个 Reducer 处理,您将在指定的输出目录中获得单个输出文件。
【讨论】:
MapReduce 上 reducer 的默认值是 1,与 (key,value) 对的数量无关。
如果您为 MapReduce 作业设置了 Reducer 的数量,则无论不同 (key,value) 对的数量如何,Reducer 的数量都不会超过定义的值。
一旦 Mapper 任务完成,输出将由Partitioner 处理,将数据划分为Reducers。 hadoop 的默认分区器是HashPartitioner,它根据键的哈希值对数据进行分区。它有一个名为getPartition 的方法。它需要key.hashCode() & Integer.MAX_VALUE 并使用number of reduce tasks 找到modulus。
因此,reducer 的数量永远不会超过您在 Driver 类中定义的数量。
【讨论】: