http://www.aboutyun.com/thread-8927-1-1.html





Mapreduce在hadoop中是一个比較难以的概念。以下须要用心看,然后自己就能总结出来了。

概括:

combine和partition都是函数。中间的步骤应该仅仅有shuffle!



1.combine

combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,能够自己定义的。

combine函数把一个map函数产生的<key,value>对(多个key,value)合并成一个新的<key2,value2>.将新的<key2,value2>作为输入到reduce函数中

这个value2亦可称之为values,由于有多个。这个合并的目的是为了降低网络传输。



详细实现是由Combine类。

实现combine函数,该类的主要功能是合并同样的key键。通过job.setCombinerClass()方法设置。默觉得null,不合并中间结果。实现map函数

详细调用:(下图是调用reduce,合并map的个数)



难点:不知道这个reduce和mapreduce中的reduce差别是什么?

以下简单说一下:后面慢慢琢磨:

在mapreduce中。map多,reduce少。

在reduce中因为数据量比較多。所以干脆。我们先把自己map里面的数据归类,这样到了reduce的时候就减轻了压力。



这里举个样例:

map与reduce的样例

map理解为销售人员,reduce理解为销售经理。

每一个人(map)仅仅管销售,赚了多少钱销售人员不统计。也就是说这个销售人员没有Combine,那么这个销售经理就累垮了。由于每一个人都没有统计,它须要统计全部人员卖了多少件。赚钱了多少钱。

这样是不行的。所以销售经理(reduce)为了减轻压力,每一个人(map)都必须统计自己卖了多少钱,赚了多少钱(Combine),然后经理所做的事情就是统计每一个人统计之后的结果。这样经理就轻松多了。所以Combine在map所做的事情。减轻了reduce的事情。

(这就是为什么说map的Combine干reduce的事情。相信你应该明确了)

public  static void main(String[] args)throws IOException {

        Configuration conf = new Configuration();

        Job job = new Job(conf);

        job.setInputFormatClass(TextInputFormat.class);

        job.setMapperClass(Mapper.class);

        job.setCombinerClass(reduce.class);

        job.setPartitionerClass(HashPartitioner.class);

        job.setReducerClass(Reducer.class);

        job.setOutputFormatClass(TextOutFormat.class);

    }

}

2.partition

partition是切割map每一个节点的结果,依照key分别映射给不同的reduce。也是能够自己定义的。这里事实上能够理解归类。

我们对于错综复杂的数据归类。比方在动物园里有牛羊鸡鸭鹅。他们都是混在一起的。可是到了晚上他们就各自牛回牛棚。羊回羊圈,鸡回鸡窝。partition的作用就是把这些数据归类。仅仅只是在敲代码的时候,mapreduce使用哈希HashPartitioner帮我们归类了。这个我们也能够自己定义。

HashPartitioner是mapreduce的默认partitioner。

计算方法是



which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks。得到当前的目的reducer。

以下在看该怎样自己定义,该怎样调用:(以下便是自己定义了一个Partition函数。红字部分是算法的核心,也就是分区的核心)

public static class Partition extends Partitioner<IntWritable, IntWritable> {

                @Override

                public int getPartition(IntWritable key, IntWritable value,

                                int numPartitions) {

                        int Maxnumber = 65223;

                        int bound = Maxnumber / numPartitions + 1;

                        int keynumber = key.get();

                        for (int i = 0; i < numPartitions; i++) {

                                if (keynumber < bound * i && keynumber >= bound * (i - 1)) {

                                        return i - 1;

                                }

                        }

                        return 0;

                }



        }

那么我们该怎样调用:(以下调用之后,你的分区函数就生效了)

public static void main(String[] args) throws IOException,

InterruptedException, ClassNotFoundException {

Configuration conf = new Configuration();

Job job = new Job(conf, "sort");

job.setJarByClass(Sort.class);

job.setMapperClass(Map.class);

job.setReducerClass(Reduce.class);

job.setPartitionerClass(Partition.class);

job.setOutputKeyClass(IntWritable.class);

job.setOutputValueClass(IntWritable.class);

FileInputFormat.setInputPaths(job, "/home/asheng/hadoop/in");

FileOutputFormat

.setOutputPath(job, new Path("/home/asheng/hadoop/out"));

job.waitForCompletion(true);

}

}

3.shuffle



shuffle就是map和reduce之间的过程。包括了两端的combine和partition。

它比較难以理解,由于我们摸不着。看不到它。它仅仅是理论存在的。并且确实存在,它属于mapreduce的框架。编程的时候。我们用不到它,它属于mapreduce框架。具体能够看通过实例让你真正明确mapreduce---填空式、分布(切割)编程

3.1shuffle的作用是

Map的结果,会通过partition分发到Reducer上,Reducer做完Reduce操作后。通过OutputFormat,进行输出

shuffle阶段的主要函数是fetchOutputs(),这个函数的功能就是将map阶段的输出,copy到reduce 节点本地。

MapReduce中combine、partition、shuffle的作用是什么的更多相关文章

  1. MapReduce中的Shuffle和Sort分析

    MapReduce 是现今一个非常流行的分布式计算框架,它被设计用于并行计算海量数据.第一个提出该技术框架的是Google 公司,而Google 的灵感则来自于函数式编程语言,如LISP,Scheme ...

  2. Hadoop : MapReduce中的Shuffle和Sort分析

    地址 MapReduce 是现今一个非常流行的分布式计算框架,它被设计用于并行计算海量数据.第一个提出该技术框架的是Google 公司,而Google 的灵感则来自于函数式编程语言,如LISP,Sch ...

  3. 关于MapReduce中自定义Combine类(一)

    MRJobConfig      public static fina COMBINE_CLASS_ATTR      属性COMBINE_CLASS_ATTR = "mapreduce.j ...

  4. Hadoop学习之路(二十三)MapReduce中的shuffle详解

    概述 1.MapReduce 中,mapper 阶段处理的数据如何传递给 reducer 阶段,是 MapReduce 框架中 最关键的一个流程,这个流程就叫 Shuffle 2.Shuffle: 数 ...

  5. MapReduce详解及shuffle阶段

    hadoop1.x和hadoop2.x的区别: Hadoop1.x版本: 内核主要由Hdfs和Mapreduce两个系统组成,其中Mapreduce是一个离线分布式计算框架,由一个JobTracker ...

  6. 在mapreduce中做分布式缓存的问题

    一.问题描述: 主要解决一个问题,就是两个表做join,两个表都够大,单个表都无法装入内存. 怎么做呢?思路就是对做join的字段做排序两个表都排序,然后针对一个表a逐行读取,希望能够在内存中加载到另 ...

  7. Mapreduce中的字符串编码

    Mapreduce中的字符串编码 $$$ Shuffle的执行过程,需要经过多次比较排序.如果对每一个数据的比较都需要先反序列化,对性能影响极大. RawComparator的作用就不言而喻,能够直接 ...

  8. Spark中的Spark Shuffle详解

    Shuffle简介 Shuffle描述着数据从map task输出到reduce task输入的这段过程.shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过s ...

  9. hadoop的mapReduce和Spark的shuffle过程的详解与对比及优化

    https://blog.csdn.net/u010697988/article/details/70173104 大数据的分布式计算框架目前使用的最多的就是hadoop的mapReduce和Spar ...

随机推荐

  1. DML语句的使用(delete,update,insert)

     8)DML语句的使用   在PL/SQL中,DML语句与前面学习的 相同.    begin     --执行插入操作   insert into t001(id) values(1);     - ...

  2. POSIX 线程编程(一)简介

    简介 在共享内存的多处理器结构中,可以用线程来实现并行.对于UNIX系统, IEEE POSIX 1003.1c标准规定了C语言线程编程接口的标准.这份标准的实现就是POSIX threads, 或者 ...

  3. [Javascript] Delegate JavaScript (ES6) generator iteration control

    We can execute generators from generators, and delegate the iteration control with the yield* keywor ...

  4. 通过Nginx訪问FastDFS文件系统并进行图片文件裁剪的性能測试和分析

    前段时间公司的分布式图片文件系统(FastDFS)做了图片裁剪和缩放功能,并把缩放计算和FastDFS做了解耦分离,前端用虚拟机作为图片文件缩放的訪问代理层(Nginx Proxy),后端使用ngin ...

  5. Baby_Step,Gaint_Step(分析具体解释+模板)

    下面是总结自他人博客资料.以及本人自己的学习经验. [Baby_Step,Gaint_Step定义] 高次同余方程. BL == N (mod P) 求解最小的L.因为数据范围非常大,暴力不行 这里用 ...

  6. s3c2440的IIC控制

    在tq2440和mini2440上都连接着EEPROM 它们作用也不过測试I2C总线能否用. 当中在mini2440上EEPROM型号是 AT24C08,在tq2440上这个型号是 AT24C02A. ...

  7. bzoj1830: [AHOI2008]Y型项链(LCP+贪心)

    1830: [AHOI2008]Y型项链 题目:传送门 简要题意: 给出三个字符串,可以对任意字符串进行操作,每次操作都可以再其中一个字符串的末尾删除或添加一个字符,求最小操作数使得所有的字符串相同 ...

  8. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  9. hdoj--5606--tree(并查集)

    tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  10. Elasticsearch之四种查询类型和搜索原理(博主推荐)

    Elasticsearch Client发送搜索请求,某个索引库,一般默认是5个分片(shard). 它返回的时候,由各个分片汇总结果回来. 官网API https://www.elastic.co/ ...