mr的shuffle 
mapShuffle 
数据存到hdfs中是以块进行存储的,每一个块对应一个分片,maptask就是从分片中获取数据的 
在某个节点上启动了map Task,map Task读取是通过k-v来读取的,读取的数据会放到环形缓存区,这样做的目的是为了防止IO的访问次数,然后环形缓存区的内存达到一定的阀值的 
时候会把文件益写到磁盘,溢出的各种小文件会合并成一个大文件,这个合并的过程中会进行排序,这个排序叫做归并排序 
map阶段会涉及到 
1.sort排序(默认按字典排序) 
2.合并(combiner合并) 
3.文件合并(merage 合并 总共有三种,默认是内存到磁盘) 
4.压缩(设置压缩就会执行) 
reduce Shuffle 
归并排序完成后reduce端会拉取map端的数据,拉取的这个过程叫做copy过程,拉取的数据合并成一个文件,GroupComparator(默认,这个我们也可以自定义)是专门对文件夹里面的key进行分组 
然后就形成k-List(v1,v2,v3)的形式,然后reduce经过业务处理,最终输出到hdfs,如果设置压缩就会执行,不设置则不执行 
reduce阶段会涉及到: 
1.sort排序 
2.分组(将相同的key的value放到一个容器的过程) 
3.merge文件合并

4.压缩


spark shuffle的版本一
1.rdd中一个partition对应一个shufflemapTask任务,因为某个节点上可以有多个分区,所以可以有多个shufflemapTask 
2.每一个shufflemapTask都会为每一个resultTask创建一个bucket缓存(内存),bucket的数量=M x R,当内存达到一定值的时候会益写到shuffleblockfile文件中 
3.shuffleMap task会封装成一个叫mapStatus,这个mapstatus里面包含了每一个resultTask拉取数据的大小 
Mapstatus: 是ShuffleMapTask返回调度器scheduler的对象,包括任务运行的块管理器地址和对应每个reducer的输出大小。 
如果partitions的数量大于2000,则用HighlyCompressedMapStatus,否则用CompressedMapStatus。 
4.每一个resultTask拉取过来的数据,就会在内部形成一个rdd,这个rdd叫做shuffleRdd,这个rdd的数据优先存放到内存中,内存中不够然后存到磁盘里 
如果是groupByKey算子就结束了,下次执行ReduceByKey的时候,再进行相同key的聚合操作,这个时候会把shuffle rdd进行聚合操作生成mapPartitionRdd,就是我们执行reduceByKey之后得到的那个rdd 
spark shuffle的版本二 
版本一的缺点:版本一的shuffle方式中会产生大量的小文件, 
版本二的优点:就是为了减少这么多小文件的生成 
bucket的数量=cpu*resultTask的个数 
版本二设计的原理:一个shuffleMapTask还是会写入resultTask对应个数的本地文件,但是当下一个shuffleMapTask运行的时候会直接把数据写到之前已经建立好的本地文件,这个文件可以复用,这种复用机制叫做consolidation机制 
我们把这一组的shuffle文件称为shuffleGroup,每个文件中都存储了很多shuffleMapTask对应的数据,这个文件叫做segment,这个时候因为不同的shuffleMapTask都是存在一个文件中 
所以建立索引文件,来标记shuffleMapTask在shuffleBlockFile的位置+偏移量,这样就可以在一个文件里面把不同的shuffleMaptask数据分出来 
spark shuffle的版本三 
版本三的优点:是通过排序建立索引,相比较于版本二,它只有一个临时文件,不管有多少个resultTask都只有一个临时文件, 
缺点:这个排序操作是一个消耗CPU的操作,代价是会消耗很多的cpu 
版本二占用内存多,打开文件多,但不需排序,速度快。版本三占用内存少,打开文件少,速度相对慢。实践证明使用第二种方案的应用场景更多些。 
shuffle的读流程 
1.有一个类blockManager,封装了临时文件的位置信息,resultTask先通过blockManager,就知道我从哪个节点拿数据 
如果是远程,它就是发起一次socket请求,创建一个socket链接。然后发起一次远程调用,告诉远程的读取程序,读取哪些数据。读到的内容再通过socket传过来。 
2.一条条读数据和一块块读数据的优缺点? 
如果是一条条读取的话,实时性好,性能低下

一块块读取的话性能高,但是实时性不好

Shuffle读由reduce这边发起,它需要先到临时文件中读,一般这个临时文件和reduce不在一台节点上,它需要跨网络去读。但也不排除在一台服务器。不论如何它需要知道临时文件的位置, 
这个是谁来告诉它的呢?它有一个BlockManager的类。这里就知道将来是从本地文件中读取,还是需要从远程服务器上读取。 
读进来后再做join或者combine的运算。 
这些临时文件的位置就记录在Map结构中。 
可以这样理解分区partition是RDD存储数据的地方,实际是个逻辑单位,真正要取数据时,它就调用BlockManage去读,它是以数据块的方式来读。 
比如一次读取32k还是64k。它不是一条一条读,一条一条读肯定性能低。它读时首先是看本地还是远程,如果是本地就直接读这个文件了, 
如果是远程,它就是发起一次socket请求,创建一个socket链接。然后发起一次远程调用,告诉远程的读取程序,读取哪些数据。读到的内容再通过socket传过来。

 

MR的shuffle和Spark的shuffle之间的区别的更多相关文章

  1. 简要MR与Spark在Shuffle区别

    一.区别 ①本质上相同,都是把Map端数据分类处理后交由Reduce的过程. ②数据流有所区别,MR按map, spill, merge, shuffle, sort, r educe等各阶段逐一实现 ...

  2. 【Spark】Spark的Shuffle机制

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

  3. 详细探究Spark的shuffle实现

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

  4. MapReduce Shuffle 和 Spark Shuffle 原理概述

    Shuffle简介 Shuffle的本意是洗牌.混洗的意思,把一组有规则的数据尽量打乱成无规则的数据.而在MapReduce中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规 ...

  5. Spark中shuffle的触发和调度

    Spark中的shuffle是在干嘛? Shuffle在Spark中即是把父RDD中的KV对按照Key重新分区,从而得到一个新的RDD.也就是说原本同属于父RDD同一个分区的数据需要进入到子RDD的不 ...

  6. Spark RDD概念学习系列之Spark Hash Shuffle内幕彻底解密(二十)

    本博文的主要内容: 1.Hash Shuffle彻底解密 2.Shuffle Pluggable解密 3.Sorted Shuffle解密 4.Shuffle性能优化 一:到底什么是Shuffle? ...

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

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

  8. Spark 的 Shuffle过程介绍`

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

  9. spark的shuffle和原理分析

    概述     Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂.    在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段 ...

随机推荐

  1. NPOI从数据库中调取数据直接导出到EXCEL中

    关于NPOI NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex. ...

  2. Win7配置SVN详细步骤(服务器和客户端)

    下载并安装服务器端SVN  VisualSVN Server 下载并安装客户端SVN  TortoiseSVN 创建SVN库 在C盘创建文件夹MySVN(可自由命名),打开文件夹----右键Torto ...

  3. 超全面的JavaWeb笔记day22<文件上传>

    文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2 文件上传对页面的要求 上传文件的要求比较多,需要记一下: 1. 必须使用 ...

  4. oc中的各种遍历(迭代)方法

    转载自文顶顶老师的博客:http://www.cnblogs.com/wendingding/p/5251937.html 说明: 1)该文简短介绍在ios开发中遍历字典.数组和集合的集中常见方式 2 ...

  5. shell基础(七)-条件语句

    条件语句在编写脚本经常遇到:用于处理逻辑问题. 一 IF 语句 if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句 ...

  6. linux命令之scp

    两个主机之间copy数据经常用到命令 1.copy文件命令 scp /home/test/1.mp3 root@192.168.1.20:/home/test/music 2.copy文件目录命令 s ...

  7. Chosen

    前言: 想要达到下拉框有多选的情况. 过程: 1.因为本次工作项目使用的是surperUI,而它则是基于bootstrap框架搭建而成的.于是自然而然的就想到了使用bootstrap中的select插 ...

  8. 为什么在js当中没有var就是全局变量

    因为,在js中,如果某个变量没有var声明,会自动移到上一层作用域中去找这个变量的声明语句,如果找到,就是用,如果没找到, 就继续向上寻找,一直查找到全局作用域为止,如果全局中仍然没有这个变量的声明语 ...

  9. Android TextView实现跑马灯

    TextView实现跑马灯的效果:例子一: 这个例子可以解决给一个TextView实现跑马灯的效果,但是不能解决给所有的TextView实现跑马灯的效果. <TextView android:l ...

  10. php查询操作实现投票功能

    这篇文章主要为大家详细介绍了php查询操作实现投票功能的具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   本文实例为大家分享了php查询操作实现投票功能的代码,供大家参考,具体内容如下 ...