Hadoop学习笔记三:MapReduce的Shuffle图解

数据报
• 阅读 2536

学习的时候没有太过留意Shuffle这个概念,以至于还以为是不是漏掉了什么知识点,后面看了一些帖子才发现Shuffle原来是map()方法执行结束到reduce()方法执行这么一大段过程....
小声BB:实质上该过程包含许多环节,不知道为啥就统称Shuffle了......

1. Mapper的写出

图见意现 -- 直接上图:

Hadoop学习笔记三:MapReduce的Shuffle图解

需要明确的点:

  • 在环形缓冲区触发溢写时,进行的排序是先根据每个键值对的分区进行排序,然后再根据key进行排序
  • 每次写出实际上包括两个文件,一个是meta数据写出形成的index文件,另一个则是排序后的data文件
  • 在溢写时发生一次排序,为快速排序算法;在最后合并为一个整体文件时,因为各小文件已有序,直接归并排序即可
  • Reducer从Mapper节点的最终文件file.out读取数据,根据index文件只读取对应分区的数据

2. Mapper的分区

分区的作用是将Mapper阶段输出的结果分为不同的区域,并传送给不同的ReduceTask,因此分区数和Reduce的并行度是相互决定的,即 Num Of Partitions = Num Of ReduceTask

设置ReduceTask数量:job.setNumReduceTasks(n)

分区方式:

  • 默认方式:hash(key) % Num of ReduceTask -- 键值哈希取模
  • 自定义分区类:定义类继承Partitioner类,并重写getPartition()方法

注意:

  • 在没有设置ReduceTask数目的情况下,MR默认只分配一个ReduceTask,即不管自定义分区方法需要分几个区,最后的结果都只会进入这一个Reducer,最终生成一个结果文件;
  • 如果设置了ReduceTask数量大于1,但该数量小于自定义的分区数,则运行MR程序会报错,因为会产生一些Mapper的结果数据没有Reducer来获取的情况
  • 如果设置的分区数 < ReduceTask的数量,那么程序会正常执行,最后也会生成和ReduceTask数相等的结果文件,但其中有 (ReduceTask数 - 分区数) 个空文件,因为这部分的Reducer没有输入

3. Mapper的排序

  • 比较简单,溢写时快速排序,合并时归并排序;排序标准为对key进行字典排序
  • 可自定义排序(在自定义Bean对象时使用),需要让自定义的Bean类实现WritableComparable接口并重写compareTo方法,实际上和Java中的Comparable基本一样

4. Reducer的读入

Hadoop学习笔记三:MapReduce的Shuffle图解
需要明确的点:

  • 一个ReduceTask只会读取每个Mapper结果的同一个分区内的数据
  • 拷贝到Reducer节点先是保存在内存中,如果内存不够就刷写到磁盘
  • 所有数据拷贝完成后,对内存和磁盘(假如发生了刷写)进行Merge && Sort,这里排序也是默认根据Key进行字典排序,目的是让数据中key相同的KV对排列在一起,方便reduce方法的调用。【reduce方法调用前会将所有key相同的value封装为iterator迭代器对象,对于一个key调用一次reduce方法】

5. Reducer的排序

Reduce端的排序同样也是应用于使用了自定义Bean对象的场景,通过自定义的排序方式让Reducer把我们指定的keys判断为同样的key(在默认reduce排序中会被判定为非同key)

注意!注意!注意!此处有坑!!!

  • Reducer端的自定义排序需要自定义排序类,继承WritableComparator并重写compare方法,并在Driver中关联我们自定义的排序类
  • Mapper端的自定排序需要在我们定义Bean对象的时候让Bean对象继承WritableComparable类并重写方法CompareTo
点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
MapReduce之Shuffle,自定义对象,排序已经Combiner
1\.Shuffle:MapReduce的计算模型主要分为三个阶段,Map,shuffle,Reduce。Map负责数据的过滤,将文件中的数据转化为键值对,Reduce负责合并将具有相同的键的值进行处理合并然后输出到HDFS。为了让Reduce可以并行处理map的结果,必须对Map的输出进行一定的排序和分割,然后交个Red
Stella981 Stella981
3年前
Apache Spark探秘:Spark Shuffle实现
ApacheSpark探秘:SparkShuffle实现博客分类:hadoopspark对于大数据计算框架而言,Shuffle阶段的设计优劣是决定性能好坏的关键因素之一。本文将介绍目前Spark的shuffle实现,并将之与MapReduce进行简单对比。本文的介绍顺序是:shuffle基本概念,MapReduceShuffle发展史以及Sp
Stella981 Stella981
3年前
Spark Shuffle之Sort Shuffle
源文件放在github,随着理解的深入,不断更新,如有谬误之处,欢迎指正。原文链接https://github.com/jacksu/utils4s/blob/master/sparkknowledge/md/sortshuffle.md(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%
Stella981 Stella981
3年前
Hadoop(十四)——hadoop之MapReduce理论篇(五)——MapReduce详细工作流程
一、Shuffle机制Mapreduce确保每个reducer的输入都是按键排序的。系统执行排序的过程(即将map输出作为输入传给reducer)称为shuffle。二、MapReduce工作流程1.图示流程!(https://oscimg.oschina.net/oscnet/b44af54dac168
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
MapReduce的逻辑切分split与合并combiner
        在之前的博客《MapReduce中shuffle阶段概述及计算任务流程》(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fweixin_44318830%2Farticle%2Fdetails%2F103044135),小菌为大家分享了Ma
Stella981 Stella981
3年前
Hadoop学习之路(二十三)MapReduce中的shuffle详解
概述1、MapReduce中,mapper阶段处理的数据如何传递给reducer阶段,是MapReduce框架中最关键的一个流程,这个流程就叫Shuffle2、Shuffle:数据混洗——(核心机制:数据分区,排序,局部聚合,缓存,拉取,再合并排序)3、具体来说:就是将MapTask输出的处理结果数据,按照Par
Stella981 Stella981
3年前
Spark Shuffle之Hash Shuffle
源文件放在github,如有谬误之处,欢迎指正。原文链接https://github.com/jacksu/utils4s/blob/master/sparkknowledge/md/hashshuffle.md(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%
Stella981 Stella981
3年前
MapReduce+Shuffle详解
之前一直对Hadoop的MapReduce过程知道皮毛,如今特地深入学习了这个过程一下,把我的理解写下来。以下就是是我读书,看博客,然后根据自己的理解和经验总结出来的。错误的地方,还请大神指出。^\_^由衷感谢~宏观上来说,Hadoop的MapReduce在执行每个作业的时候要经历2个大阶段:Map阶段和Reduce阶段。下图是官方对整个
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
数据报
数据报
Lv1
我不躲不藏,等生活爱我。
文章
3
粉丝
0
获赞
0