一、区别

①本质上相同,都是把Map端数据分类处理后交由Reduce的过程。

②数据流有所区别,MR按map, spill, merge, shuffle, sort, r

educe等各阶段逐一实现。Spark基于DAG数据流,可实现更复杂数据流操作(根据宽/窄依赖实现)

③实现功能上有所区别,MR在map中做了排序操作,而Spark假定大多数应用场景Shuffle数据的排序操作不是必须的,而是采用Aggregator机制(Hashmap每个元素<K,V>形式)实现。(下面有较详细说明)

ps:为了减少内存使用,Aggregator是在磁盘进行,也就是说,尽管Spark是“基于内存的计算框架”,但是Shuffle过程需要把数据写入磁盘

二、MR中的Shuffle

在MR框架中,Shuffle是连接Map和Reduce之间的桥梁,Map的输出结果需要经过Shuffle过程之后,也就是经过数据分类以后再交给Reduce进行处理。因此,Shuffle的性能高低直接影响了整个程序的性能和吞吐量。由此可知,Shuffle是指对Map输出结果进行分区、排序、合并等处理并交给Reduce的过程。因此,MapReduce的Shuffle过程分为Map端的操作和Reduce端的操作,如下图:

简单点说: Map端Shuffle过程,就是对Map输出结果写入缓存、分区、排序、合并再写入磁盘。

Reduce端Shuffle过程,就是从不同Map机器取回输出进行归并后交给Reduce进行处理。

三、Spark中的Shuffle

①、Spark作为MR框架的改进,也实现了Shuffle的逻辑,如下图:

Map端的Shuffle写入(Shuffle Write)方面,每个Map根据Reduce任务的数量创造相应桶数量m*r(桶为抽象概念,m是map任务r是reduce任务),Map任务产生的结果根据分区算法(默认hash)到不同桶中。当Reduce任务启动时,会根据自己任务的id和所依赖的Map任务的id,从远端或本地取得对应的桶,作为Reduce任务的输入进行处理。

ps:在Spark1.2的版本后,Shuffle引擎改为SortShuffleManager(原来为HashShuffleManager),也就是把每个Map任务所有输出数据都写到同一个任务中,避免小文件太多对性能的影响。因此Shuffle过程中,每个Map任务会产生数据文件及所有文件两个。

②、在Reduce端的Shuffle读取(Shuffle Fetch)方面,大多数场景Spark并不在Reduce端做归并和排序,而是采用Aggregator机制。Aggregator本质是个HashMap,其中每个元素都是<K,V>形式。

ps:以词频统计为例,它会将从Map端拉取到的每一个(key,value),更新或插入到HashMap中。若在HashMap中没有查找到这个key,则把这个(key,value)插入其中;若找到这个key,则把value的值累加到V上去。这样就不需要预先把所有的(key,value)进行归并和排序,而是来一个处理一个,避免外部排序这一步骤。

③、窄依赖宽依赖

以是否包含Shuffle操作为判断依据,RDD中的依赖关系可以分为窄依赖与宽依赖,区别如下

窄依赖:一个父RDD的分区对应一个子RDD的分区,或者多个父RDD的分区对应一个子RDD的分区。典型操作包括map/filter/union等,不会包含Shuffle操作

宽依赖:一个父RDD的一个分区对应一个子RDD的多个分区。典型操作包括groupByKey/sortByKey等,通常包含Shuffle操作

ps:对于join操作,视情况而定,如上图左侧进行协同划分,数据窄依赖。如上图右侧做非协同划分,属于宽依赖。

④、阶段划分

Spark根据DAG图中的RDD依赖关系,把一个作业分成多个阶段。参考下图例子过程:

Stage2为窄依赖,可以把多个fork/join合并为一个,不但减少了大量的全局路障,而且无需保存很多中间结果RDD,可以极大提高性能,该过程叫流水线优化(Pipeline)


学习交流,有任何问题还请随时评论指出交流。

简要MR与Spark在Shuffle区别的更多相关文章

  1. spark.sql.shuffle.partitions和spark.default.parallelism的区别

    在关于spark任务并行度的设置中,有两个参数我们会经常遇到,spark.sql.shuffle.partitions 和 spark.default.parallelism, 那么这两个参数到底有什 ...

  2. Spark的shuffle和MapReduce的shuffle对比

    目录 MapperReduce的shuffle Spark的shuffle 总结 MapperReduce的shuffle shuffle阶段划分 Map阶段和Reduce阶段 任务 MapTask和 ...

  3. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

  4. 【Spark】Spark的Shuffle机制

    MapReduce中的Shuffle 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性 ...

  5. 详细探究Spark的shuffle实现

    Background 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环 节,shuffle的性能高低直接影响 ...

  6. [Spark] - HashPartitioner & RangePartitioner 区别

    Spark RDD的宽依赖中存在Shuffle过程,Spark的Shuffle过程同MapReduce,也依赖于Partitioner数据分区器,Partitioner类的代码依赖结构主要如下所示: ...

  7. 【Spark篇】---Spark中Shuffle文件的寻址

    一.前述 Spark中Shuffle文件的寻址是一个文件底层的管理机制,所以还是有必要了解一下的. 二.架构图 三.基本概念: 1) MapOutputTracker MapOutputTracker ...

  8. 【Spark篇】---Spark中Shuffle机制,SparkShuffle和SortShuffle

    一.前述 Spark中Shuffle的机制可以分为HashShuffle,SortShuffle. SparkShuffle概念 reduceByKey会将上一个RDD中的每一个key对应的所有val ...

  9. Spark 的 Shuffle过程介绍`

    Spark的Shuffle过程介绍 Shuffle Writer Spark丰富了任务类型,有些任务之间数据流转不需要通过Shuffle,但是有些任务之间还是需要通过Shuffle来传递数据,比如wi ...

随机推荐

  1. centos7 mysql 自动补全

    1 yum -y install epel-release #配置erel源 2 yum -y install python-pip 3 pip install mycli #用pip安装 可能会出现 ...

  2. CD租赁售卖系统javaweb系统展示SSM框架

    一.功能要点 1.管理员登录 2.用户注册登录 3.用户权限,可以查看可借或可买cd,并实现对cd的买租 4.管理员可以添加cd, 5.cd的类型,价格由管理员设置 二.运行环境 数据库mysql: ...

  3. 有了Git这个功能,再也不需要依赖IDE了!

    大家好,今天给大家介绍一个隐藏的功能--搜索. 我们在写代码的时候经常遇到的一种情况就是,我们想要知道某一个函数是怎么定义的,这样我们才能知道该如何调用它.如果代码少的话我们当然可以自己人肉查找,但是 ...

  4. monkey在指定的activity里面运行

    下载包地址:链接: https://pan.baidu.com/s/1Wk2eOj3saZx71Mx6pT2L4Q 提取码: gupa 运行方式:步骤1: 将工具下载下来放到本地目录下,解压步骤2:配 ...

  5. Consul的使用

    Consul的使用 ​ 生产部署中,Consul安装在要注册服务的每个节点上.Consul有两种运行模式:客户端和服务器端,每个Consul数据中心必须至少有一个服务器,负责维护Consul状态,为了 ...

  6. vue第十三单元(指令的作用,指令的钩子函数)

    第十三单元(指令的作用,指令的钩子函数) #课程目标 1.了解自定义指令的应用场景 2.掌握自定义全局和局部指令 3.掌握指令的钩子函数 #知识点 #一.认识自定义指令 除了核心功能默认内置的指令 ( ...

  7. [日常摸鱼]poj1151Atlantis-扫描线

    题意:给一堆长宽平行于坐标轴的长方形求并的面积 我个沙茶快写了一晚上- 大概思想就是先根据$y$坐标排个序,把$y$坐标离散化一下,放到线段树里面维护,这里的写法是让线段树的节点储存这个点对应的整段线 ...

  8. Centos7安装packstack

    Centos7安装packstack 步骤一 下载centos7.6 https://archive.kernel.org/centos-vault/7.6.1810/isos/x86_64/Cent ...

  9. 为什么会有kafka消息系统?小问题藏着大细节!

    前言:老刘今天写这篇文章首先想对一些复制粘贴的博客表达不满:其次是想用通俗易懂的话解释消息系统:最后欢迎各位英雄好汉.女中豪杰前来battle. 1. 为什么有消息系统? 1.1 背景 今天复习kaf ...

  10. git原理学习记录:从基本指令到背后原理,实现一个简单的git

    一开始我还担心 git 的原理会不会很难懂,但在阅读了官方文档后我发现其实并不难懂,似乎可以动手实现一个简单的 git,于是就有了下面这篇学习记录. 本文的叙述思路参照了官方文档Book的原理介绍部分 ...