Hadoop 为什么要在MapReduce框架中使用两个(或更多)约简器?

Hadoop 为什么要在MapReduce框架中使用两个(或更多)约简器?,hadoop,mapreduce,Hadoop,Mapreduce,例如,假设您想计算一个巨大的名称文件中包含的名称。您可以轻松地将文件拆分为若干个块,并将其发送到映射器,映射器输出到单个reducer,而reducer将输出包含结果列表的单个文件。听起来很不错 现在,两个(或更多)减速器如何帮助这一过程变得更快?据我所知,所有映射程序都会向每个reducer发送自己的数据,以便对其进行缩减,每个reducer都会输出自己的文件及其结果。因此,在一个作业中,例如使用2个减速机,系统内传输的数据将乘以减速机的数量,所有减速机的输出将完全相同(希望如此)。在其他情况

例如,假设您想计算一个巨大的名称文件中包含的名称。您可以轻松地将文件拆分为若干个块,并将其发送到映射器,映射器输出到单个reducer,而reducer将输出包含结果列表的单个文件。听起来很不错

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


似乎我遗漏了一些东西,我真的希望能就这个话题给出一个小的解释或一些指导。谢谢您的时间。

您的困惑在于MapReduce如何工作。我将尝试按照您提供的相同示例进行解释,以澄清您的疑问

拥有2个或更多减速机的想法是因为您不希望将所有信息发送到一台机器,从而使其崩溃。因此,如果您最初将10条记录发送到一个reducer,那么现在如果您有2个reducer,那么流程将分别发送5条记录(最好的情况是,这取决于您的哈希函数)。每个reducer都将获得自己的数据共享

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

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

如果使用1减速机,所有这些记录将发送到同一减速机,因此单个输出将为:

> 10
如果您使用的是2Reducer,在最佳情况下,每个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

请注意,我假设键是找到的名称,您想要的输出只是计算文件中的名称数

您的困惑在于如何MapReduce工作。我将尝试按照您提供的相同示例进行解释,以澄清您的疑问

拥有2个或更多减速机的想法是因为您不希望将所有信息发送到一台机器,从而使其崩溃。因此,如果您最初将10条记录发送到一个reducer,那么现在如果您有2个reducer,那么流程将分别发送5条记录(最好的情况是,这取决于您的哈希函数)。每个reducer都将获得自己的数据共享

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

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

如果使用1减速机,所有这些记录将发送到同一减速机,因此单个输出将为:

> 10
如果您使用的是2Reducer,在最佳情况下,每个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

请注意,我假设键是找到的名称,您想要的输出只是计算文件中的名称数

@dbustosp解释得很好

我想添加一张图表,这将消除您的疑虑


从上图中可以看出,您也在reducer端实现了并行处理。这将使您获得与单个reducer相比的高吞吐量。

@dbustosp解释得很好

我想添加一张图表,这将消除您的疑虑


从上图中可以看出,您在reducer端也实现了并行处理。这将使您获得与单个reducer相比的高吞吐量。

我认为您对MapReduce有些困惑。拥有2个或更多减速机的想法是因为您不希望将所有信息发送到一台机器,从而使其崩溃。因此,如果您最初将10条记录发送到一个reducer,那么现在如果您有2个reducer,那么流程将分别发送5条记录(最好的情况是,这取决于您的哈希函数),谢谢您的回答。因此,如果我想在我的示例中使用2个减缩器,我只需使用自定义分区器拆分从映射器输出的数据,每个减缩器都将得到它的共享(相当于两个系统减少它们自己的数据集?)并最终合并它们的输出!因此,这将导致更好的性能。到目前为止我的推理正确吗?我想你对MapReduce有点困惑。拥有2个或更多减速机的想法是因为您不希望将所有信息发送到一台机器,从而使其崩溃。因此,如果您最初将10条记录发送到一个reducer,那么现在如果您有2个reducer,那么流程将分别发送5条记录(最好的情况是,这取决于您的哈希函数),谢谢您的回答。因此,如果我想在我的示例中使用2个减缩器,我只需使用自定义分区器拆分从映射器输出的数据,每个减缩器都将得到它的共享(相当于两个系统减少它们自己的数据集?)并最终合并它们的输出!因此,这将导致更好的性能。到目前为止,我的推理正确吗?