Hadoop里的Partitioner和Combiner两个阶段

人们对于Mapreduce程序刚开始时都认为只需要一个reduce就够了。毕竟,在你处理数据之前一个reducer已经把数据都分好类了,有谁不喜欢分好类的数据呢。但是这样我们就忽略了并行计算的优势。如果只有一个reducer,我们的云计算就退化成了一个小雨点。


在多个reducer的情况下,我们需要某种机制来控制mapper的结果的分配问题。这是就Partitioner的工作了。

在默认情况下,hadoop通过比较key的hash值来分配,默认使用HashPartitioner。

有时默认的功能不能满足我们的要求,比如我们以前自定义的Edge类(http://blog.csdn.net/on_way_/article/details/8589187)。当我们想要知道每个机场乘客起飞的数量时。我们有如下数据

(北京, 上海)   张三

(北京, 青岛)  李四。。。。。。。

如果我们用HashPartitioner来分配,那么这两行就会被送往不同的reducer上,机场起飞的数量就会被算两次,而且每次都是错误的。

我们需要为我们的应用程序定制一个partitioner。

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;


public class EdgePartitioner implements Partitioner<Edge, Writable>{

	@Override
	public void configure(JobConf job) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int getPartition(Edge key, Writable value, int numPartitions) {
		// TODO Auto-generated method stub
		return key.getDepartureNode().hashCode() % numPartitions;
	}

}

在map和reduce两个阶段之间,一个MapReduce程序必须把mapper的输出分配到多个reducer上,这个过程叫做shuffling,因为一个mapper的输出结果有可能被分配到集群中的多个节点中去。


Combiner----local reduce

在有些情况下,我们希望在分配mapper的结果之前进行一次“local reduce”。比如WordCount程序,我们在处理完一个文档之后得到了“the”1000次,it much more efficient to store and shuffle the pair("the",574) once instread of the pair("the",1) multiple times.这个过程就叫做combiner。今天先简单介绍一下combiner,以后会自己详解。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hadoop的Shuffle阶段是指MapReduce作业的Map任务完成后,将产生的中间结果数据分发到Reduce任务所在的节点,以便Reduce任务进行处理的过程。 Shuffle阶段的具体流程如下: 1. Map任务产生中间结果数据,并将数据写入本地磁盘。 2. Map任务根据Reduce任务的数量,将数据划分为不同的分区,并对分区内的数据进行排序。 3. Map任务将排序后的分区数据打包为一个个数据块,并将数据块发送到Reduce任务所在的节点。 4. Reduce任务接收到数据块后,解压缩并将数据写入到本地磁盘。 5. Reduce任务对本地磁盘上的数据进行排序和归并操作,得到最终的结果。 Shuffle阶段是MapReduce作业中非常重要的一个阶段,它的性能直接影响到整个作业的运行效率和速度。因此,对于大规模数据处理的场景,优化Shuffle阶段是非常重要的。 ### 回答2: Hadoop的Shuffle阶段是MapReduce框架中的一个重要步骤,主要用于将Mapper阶段输出的中间键值对重新分发到Reducer节点进行归并和聚合操作。 具体流程如下: 1. Mapper阶段:每个Mapper节点将输入数据划分为多个数据块,并对每个数据块执行映射操作,将其转换为中间键值对。 2. Partitioner阶段:中间键值对根据定义的Partitioner函数,根据键值进行分区,决定将键值对分发到哪个Reducer节点。每个分区对应一个Reducer节点。 3. Combiner阶段(可选):某些情况下,可以在Mapper节点上执行Combiner函数对中间结果进行局部聚合操作,减少数据传输量。 4. Shuffle阶段:MapReduce框架将各个Mapper节点的中间键值对按照Partitioner函数的规则进行分发到不同的Reducer节点。在Shuffle阶段,会发生以下几个过程: a. 节点注册:Mapper节点通过向JobTracker注册自己的身份和数据分片信息。 b. 数据拷贝:每个Reducer节点会启动一个副本线程(Copy Thread),负责从各个Mapper节点获取该节点分配到的数据块,并进行数据的拷贝。 c. 数据排序:数据在传输过程中,先按照键值对的键进行排序,以便后续Reducer节点对数据进行合并操作。 d. 数据保存:拷贝的数据根据键值分组保存到本地磁盘,并在内存中建立索引以供Reducer节点处理。 5. Reduce阶段:每个Reducer节点按照键值对的键进行归并操作,将相同键值的键值对进行聚合操作,生成最终结果。 总的来说,Shuffle阶段是在MapReduce框架中起到中间数据分发和归并的作用,以便将Mapper的中间结果正确地发送到对应的Reducer节点进行最终的结果处理。 ### 回答3: Hadoop的Shuffle阶段是MapReduce任务执行过程中的一个重要阶段,其主要目的是将Map阶段的输出结果按照key进行分组和排序,并将相同key的value集合发送给相应的Reduce任务进行聚合处理。 具体流程如下: 1. Map阶段:首先,输入数据被划分为多个数据块,每个数据块由一个Map任务处理。Map任务将输入数据解析为<key, value>键值对,并将这些键值对按照一定的逻辑进行映射操作,生成一组中间结果。 2. Partition阶段:Map任务根据设置的分区规则(通常是Hash函数)将中间结果的键值对分发给对应的Reduce任务。分区的目的是将数据按照key的哈希值进行划分,使得相同key的数据被发送给同一个Reduce任务。 3. Shuffle阶段:在Shuffle阶段,将相同key的中间结果按照key进行分组,将其发送给同一个Reduce任务。这个过程包括数据的传输和缓存操作。首先,Map任务将分组后的数据按照key进行排序,并将排序后的数据写入本地磁盘(称为Map输出缓冲区)。然后,通过网络将缓冲区中的数据发送给对应的Reduce任务。Reduce任务在接收到相同key的数据之后,会将这些数据按照key再次进行排序和合并,得到最终的结果。 4. Combine阶段(可选):在Shuffle阶段之后,可以选择执行Combiner操作。Combiner是在Map任务本地执行的一个局部聚合操作,用于减少数据传输和Reduce任务的负载。它将Map任务的输出结果进行合并,在每个Map任务中减少数据量,并生成更小的中间结果,以便传输给Reduce任务进行处理。 通过Shuffle阶段的处理,Hadoop可以将Map阶段输出的数据重新组织和分配给Reduce任务,实现了并行计算和分布式数据处理的效果,提高了数据处理的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值