2

我对 MapReduce 框架感到很困惑。我从不同的来源阅读有关此内容感到困惑。顺便说一句,这是我对 MapReduce Job 的想法

1. Map()-->emit <key,value>  
2. Partitioner (OPTIONAL) --> divide
    intermediate output from mapper and assign them to different
    reducers
3. Shuffle phase used to make: <key,listofvalues>    
4. Combiner,    component used like a minireducer wich perform some
    operations on    datas and then pass those data to the reducer.
    Combiner is on local    not HDFS, saving space and time.    
5. Reducer, get the data from the    combiner, perform further
    operation(probably the same as the    combiner) then release the
    output.     
6.  We will have n outputs parts,    where n is the number
    of reducers

基本上是对的?我的意思是,我发现一些消息来源说组合器是洗牌阶段,它基本上按每条记录分组...

4

3 回答 3

5

组合器与洗牌阶段完全不同。你所说的洗牌是错误的,这是你困惑的根源。

洗牌只是将键从map复制到reduce,与键生成无关。这是 Reducer 的第一阶段,另外两个阶段是排序然后归约。

对于每个映射器的输出,组合就像在本地执行一个 reducer。它基本上就像一个 reducer(它还扩展了 Reducer 类),这意味着,就像一个 reducer,它对映射器为同一个键发出的本地值进行分组。

实际上,分区是将映射输出键分配给特定的 reduce 任务,但它不是可选的。用您自己的实现覆盖默认的 HashPartitioner 是可选的。

我试图尽量减少这个答案,但您可以在 Tom White 的 Hadoop: The Definitive Guide 一书中找到更多信息,正如 Azim 所建议的那样,以及这篇文章中的一些相关内容。

于 2016-10-12T08:56:07.010 回答
3

将 combiner 视为一个 mini-reducer 阶段,它仅在每个节点内的 map 任务的输出上工作,然后再将其发送到实际的 reducer。

以经典的 WordCount 示例为例,map 任务处理的每个单词的 map 阶段输出将是 (word,1)。让我们假设要处理的输入是

“她住在印度大城市郊区的一栋带大车库的大房子里”

如果没有组合器,map 阶段将发出 (big,1) 三次和 (a,1) 三次和 (in,1) 两次。但是当使用组合器时,映射阶段会发出 (big,3)、(a,3) 和 (in,2)。请注意,这些单词中每一个的单独出现在 map 阶段中本地聚合,然后将其输出发送到 reduce 阶段。在使用 Combiner 的用例中,它会优化以确保由于本地聚合而最小化从 map 到 reduce 的网络流量。

在 shuffle 阶段,来自不同 map 阶段的输出被重定向到正确的 reducer 阶段。这是由框架内部处理的。如果使用分区器,则对输入进行混洗以相应减少会很有帮助。

于 2016-10-07T05:51:16.123 回答
1

我不认为组合器是 Shuffle 和 Sort 阶段的一部分。组合器本身就是作业生命周期的阶段之一(可选)。

这些阶段的流水线可能如下: Map --> Partition --> Combiner(optional) --> Shuffle and Sort --> Reduce

在这些阶段中,Map、Partition 和 Combiner 在同一个节点上运行。Hadoop 根据资源的可用性和可访问性以最佳方式动态选择节点来运行 Reduce Phase。Shuffle and Sort 是一个重要的中间层阶段,跨 Map 和 Reduce 节点工作。

当客户端提交作业时,Map Phase 开始处理输入文件,该文件以块的形式跨节点存储。映射器会逐行处理文件的每一行,并将生成的结果放入某个 100MB 的内存缓冲区(每个映射器的本地内存)。当这个缓冲区被填充到某个阈值时,默认情况下为 80%,这个缓冲区被排序,然后存储到磁盘中(作为文件)。每个 Mapper 可以生成多个这样的中间排序拆分或文件。当 Mapper 处理完块的所有行时,所有这些拆分都合并在一起(形成单个文件),排序(基于键),然后组合器阶段开始处理这个单个文件。请注意,如果没有分区阶段,则只会生成一个中间文件,但在分区的情况下会生成多个文件,具体取决于开发人员的逻辑。Oreilly Hadoop:权威指南,可以帮助您更详细地理解这个概念。

在此处输入图像描述

之后,Hadoop 根据键值将合并文件从每个 Mapper 节点复制到 Reducer 节点。即同一个key的所有记录都会被复制到同一个Reducer节点。

我认为,您可能对 SS 和 Reduce Phase 工作有深入了解,因此不再详细介绍这些主题。

此外,有关更多信息,我建议您阅读 Oreilly Hadoop:权威指南。这是一本很棒的 Hadoop 书籍。

于 2016-10-11T15:12:16.900 回答