Mapreduce中的分组和分区

在讲述两个概念之前,先对Mapreduce的流程做一个简单的阐述:

        (1)最简单的流程Map -> Reduce

        (2)定制了partitioner : Map -> MyPartiton -> Redcue

        (3)增加combiner(相当于在reduce之前map端的一次本地化reduce) : Map -> Combiner -> MyPartiton -> Reduce

以上就是Mapreduce中的数据处理流程。

一、Mapreduce中Partition(分区)的概念

        Hadoop采用的派发方式默认是根据散列值来派发,当数据进行map转换后,根据map后数据的key值进行散列派发,这样的一个弊端就是当数据key的值过于相似且集中时,大部分的数据就会分到同一个reducer中,从而造成数据倾斜,影响程序的运行效率。所以需要我们自己定制partition来根据自己的要求,选择记录的reducer。自定义partitioner很简单,只要自定义一个类,并且继承Partitioner类,重写其getPartition方法就好了,在使用的时候通过调用Job的setPartitionerClass指定一下即可。         Map的结果,会通过partition分发到Reducer上。如果设置了Combiner,Map的结果会先送到Combiner进行合并,再将合并后数据发送给Reducer。

        Mapper最终处理的键值对<key, value>,是需要送到Reducer去合并的,合并的时候,有相同key的键/值对会送到同一个Reducer那。哪个key到哪个Reducer的分配过程,是由Partitioner规定的。它只有一个方法,

            getPartition(Text key, Text value, int numPartitions)

        系统缺省的Partitioner是HashPartitioner,它以key的Hash值对Reducer的数目取模,得到对应的Reducer。这样就保证如果有相同的key值,肯定被分配到同一个reducre上。

二、Mapreduce中分组的概念

        分组,顾名思义,就是根据Map<key,value>中的key进行分组。在同一个分区呢,相同key的值记录是属于同一个分组的,相当于groupby key的功能。

三、Mapreduce中Combiner

      Mapreduce中的Combiner就是为了避免map任务和reduce任务之间的数据传输而设置的,Hadoop允许用户针对map task的输出指定一个合并函数。即为了减少传输到Reduce中的数据量。它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载。

Combiner的作用:

      ①每一个map可能会产生大量的输出,Combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。
      ②Combiner最基本是实现本地key的归并,Combiner具有类似本地的reduce功能。

       注意:Combiner的输出是Reducer的输入,如果Combiner是可插拔的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。




  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值