为什么要在 MapReduce 框架中使用两个(或更多)reducer?

Why would you use two(or more) reducers in a MapReduce framework?

例如,假设您要统计一个巨大名称文件中包含的名称。您可以轻松地将文件分成多个块,将其发送到您的映射器,映射器输出到单个 reducer,后者又将输出一个包含结果列表的文件。听起来不错!

现在两个(或更多)reducer 如何帮助这个过程变得更快?据我所知,所有映射器都会向每个 reducer 发送自己的数据,以便对其进行缩减,并且每个 reducer 都将输出自己的文件及其结果。因此,在一项工作中——例如使用 2 个减速器——系统内传输的数据将乘以减速器的数量,并且所有减速器的输出将完全相同(希望如此)。其他一些实例拥有多个减速器是否值得?

好像我遗漏了什么,我真的很感激关于这个主题的简短解释或指导。感谢您的宝贵时间。

您对 MapReduce 的工作方式感到困惑。我将尝试遵循您提供的相同示例,以便有一个小的解释来澄清您的疑问。

拥有 2 个或更多 reducer 的想法是因为您不想崩溃一台向其发送所有信息的机器。因此,如果您最初向一个 reducer 发送 10 条记录,现在如果您有 2 个 reducer,则该过程将每个发送 5 条记录(最好的情况,这取决于您的哈希函数)。每个减速器都将获得自己的数据份额。

按照您提供的相同示例,假设您正在使用组合器,以便映射器发送元组,例如(我知道我们可以使用组合器,这只是一个示例):

(约瑟夫,1) (乔治,1 岁) (安德鲁,1) (约瑟夫,1) (乔治,1 岁) (安德鲁,1) (阿尼巴尔,1) (玛丽,1 岁,) (安德鲁,1) (迈克尔,1)

如果你使用 1Reducer,所有这些记录将被发送到同一个 reducer,所以单个输出将是:

> 10

如果您使用 2Reducers,在最好的情况下,每个 reducer 都会获得自己的数据份额,例如:

Reducer1
(Joseph, 1)
(Joseph, 1)
(Andrew, 1)
(Andrew, 1)
(Andrew, 1)

Reducer2
(George, 1,)
(George, 1,)
(Anibal, 1)
(Mary, 1,)
(Michael, 1)

对于这种情况,您将获得 2 个输出,它们是:

> 5 
> 5

请注意,我假设密钥将是找到的 name,而您想要的输出只是计算文件中名称的数量。

@dbustosp 解释的很好

我想添加图表来消除您的疑问。

从上图中可以看出,您在 reducer 端实现了并行处理 also.That 与单个 reducer 相比,这将为您提供高吞吐量。