4

我知道映射器为每个 reducer 生成 1 个分区。reducer 如何知道要复制哪个分区?假设有 2 个节点运行 mapper 用于字数统计程序,并且配置了 2 个 reducer。如果每个 map 节点产生 2 个分区,并且两个节点中的分区都可能包含相同的单词作为 key,reducer 将如何正常工作?

例如:

如果节点 1 产生分区 1 和分区 2,并且分区 1 包含一个名为“WHO”的键。

如果节点 2 产生分区 3 和分区 4,并且分区 3 包含一个名为“WHO”的键。

如果分区 1 和分区 4 进入减速器 1(并保留到减速器 2),减速器 1 如何计算正确的字数?

如果这是不可能的,并且分区 1 和 3 将转到 reducer 1,那么 Hadoop 是如何做到的?它是否确保来自不同节点的给定键值对总是去同一个reducer?如果是这样,它是如何做到的?

谢谢,苏雷什。

4

1 回答 1

4

在您的情况下,由于分区 1 和分区 3 都使用键“WHO”,因此可以保证两个分区都使用同一个 reducer。

更新

在hadoop中,任何时候一个tasktracker的最大reduce任务数由mapred.tasktracker.reduce.tasks.maximum属性决定。
MapReduce 作业的 reducer 数量通过以下方式设置-D mapred.reduce.tasks=n

当有多个 reducer 时,map 任务对它们的输出进行分区,每个任务为每个 reduce 任务创建一个分区。每个分区中可以有许多键(及其关联的值),但任何给定键的记录都在一个分区中。分区可以由用户定义的分区函数控制,但通常默认的分区器——它使用散列函数对键进行存储——工作得很好。(Hadoop:权威指南)

因此,具有指定键的值将始终转到同一个减速器。

于 2012-05-10T05:41:33.237 回答