shuffle阶段和combiner阶段有啥区别?

Posted

技术标签:

【中文标题】shuffle阶段和combiner阶段有啥区别?【英文标题】:What's the difference between shuffle phase and combiner phase?shuffle阶段和combiner阶段有什么区别? 【发布时间】:2016-10-06 10:09:30 【问题描述】:

我对 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

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

【问题讨论】:

你消息中的数字是否代表每个操作发生的顺序? 是的,在我看来是的。 酷,无论如何,我认为下面的答案解释了这一点。 查看相关的 SE 问题:***.com/questions/22141631/… 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

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

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

“她住在一个大房子的郊区,有一个大车库 印度的城市”

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

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

【讨论】:

试试看这个教程:[link]developer.yahoo.com/hadoop/tutorial/module4.html#functionality[/… 但是,如果shuffle阶段还没有执行,combiner怎么能求和呢?我的意思是,要对值列表中的值求和,您需要在洗牌阶段之后停留!恕我直言,组合器可以在洗牌阶段之前或之后立即采取行动,具体取决于他作为输入接收的数据类型。例如,在 wordcount 中,combiner 将执行每个分区的总和,然后,这将转到 hdfs 上的真正 reducer。明白我的意思吗?谢谢【参考方案3】:

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

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

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

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

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

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

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

【讨论】:

分区不是可选的,覆盖默认分区是可选的。

以上是关于shuffle阶段和combiner阶段有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

[Hadoop]MapReducer工作过程

MapReduce shuffle过程详解!

大数据之Hadoop(MapReduce):MapReduce Shuffle的优化

python的map和reduce和Hadoop的MapReduce有啥关系

mapreduce的工作流程

大数据面试题:MapReduce核心高频面试题