【问题标题】:Why would you use two(or more) reducers in a MapReduce framework?为什么要在 MapReduce 框架中使用两个(或更多)reducer?
【发布时间】:2017-03-03 19:15:21
【问题描述】:

例如,假设您要计算包含在一个巨大名称文件中的名称。您可以轻松地将文件拆分为多个块,然后将其发送到映射器,然后映射器输出到单个 reducer,然后再输出包含结果列表的单个文件。听起来很整洁!

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

似乎我遗漏了一些东西,我真的很感激关于这个主题的一个小的解释或一些指导。感谢您的宝贵时间。

【问题讨论】:

  • 我认为您对 MapReduce 有一些困惑。拥有 2 个或更多 reducer 背后的想法是因为您不希望折叠一台将所有信息发送给它的机器。因此,如果您最初向一个 reducer 发送 10 条记录,现在如果您有 2 个 reducer,则该过程将分别发送 5 条记录(最好的情况,这取决于您的哈希函数)
  • 感谢您的回答。因此,如果我想在我的示例中使用 2 个 reducer,我只需使用自定义 Partitioner 拆分从映射器输出的数据,每个 reducer 都会获得它的份额(相当于两个系统减少自己的数据集?)并且它们的输出合并到底 !因此,这将产生更好的性能。到目前为止我的推理是否正确?

标签: hadoop mapreduce


【解决方案1】:

您的困惑在于 MapReduce 的工作原理。我将尝试遵循您提供的相同示例,以便有一个小的解释来澄清您的疑问。

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

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

(约瑟夫,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,而您想要的输出只是计算文件中名称的数量。

【讨论】:

    【解决方案2】:

    @dbustosp 解释得很好。

    我想添加一个图表来消除你的疑惑。

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

    【讨论】:

      猜你喜欢
      • 2018-02-24
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2011-04-18
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多