shuffle阶段和组合阶段之间有什么区别?

时间:2016-10-06 10:09:31

标签: hadoop mapreduce combiners partitioner

我对MapReduce框架非常困惑。我从不同的消息来源读到这个问题很困惑。顺便说一句,这是我对MapReduce作业的想法

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

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

3 个答案:

答案 0 :(得分:2)

组合器与洗牌阶段完全不相似。你所描述的改组是错误的,这是你混乱的根源。

改组只是将键从地图复制到reduce,它与密钥生成无关。它是Reducer的第一阶段,另外两个是排序然后减少。

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

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

我试图将这个答案保持在最低限度,但是你可以找到更多关于Hadoop:Tom White的权威指南的信息,正如Azim所说,以及this post中的一些相关内容。

答案 1 :(得分:1)

将组合器视为迷你减速器阶段,它只能在每个节点中的map任务输出之前将其发送到实际的reducer。

采用经典的WordCount示例,地图相位输出将是(word,1)地图任务处理的每个单词。让我们假设要处理的输入是

  

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

如果没有合成器,地图阶段会发射(大,1)三次,(a,1)三次,(in,1)两次。但是当使用组合器时,地图阶段将发射(大,3),(a,3)和(in,2)。请注意,在发出其输出以减少相位之前,这些单词中的每个单词的各个出现在映射阶段内本地聚合。在使用Combiner的使用情况下,它将进行优化以确保从地图到减少的网络流量由于本地聚合而最小化。

在随机播放阶段,各种地图阶段的输出被重定向到正确的减速阶段。这由框架内部处理。如果使用分区程序,那么随机输入以减少输入会很有帮助。

答案 2 :(得分:0)

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

这些阶段的流水线可能如下: 地图 - &gt;分区 - &gt;组合器(可选) - &gt;随机和排序 - &gt;减少

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

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

enter image description here

稍后,Hadoop会根据键值将每个Mapper节点的合并文件复制到Reducer节点。也就是说,同一个密钥的所有记录都将被复制到同一个Reducer节点。

我认为,您可能会深入了解SS和Reduce Phase工作,因此请不要详细了解这些主题。

此外,有关更多信息,我建议您阅读Oreilly Hadoop:The Definitive指南。它非常棒的Hadoop书。