Shuffle | 青训营笔记

95 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第10天

前言

由于我完全是大数据小白,在此之前完全没有学习过大数据相关的东西,因此我上课都是吃力的。特别是老师使用"行业黑话"越多,我就越是听不懂,今天的Shuffle内容可以说基本上听不懂了,我只能结合上课听到的,资料上查到的,以及自己猜的,简要说说自己的对shuffle的理解

历史

shuffle 的思想最早是源于早期谷歌发布的论文*《MapReduce》*,这是一篇关于大数据计算引擎解决方案的论文,可以说这篇论文掀开了大数据一路高歌的序幕

MapReduce

在 MapReduce 的结构中,数据的处理可以分为三个阶段:Map,Shuffle,Reduce。其中 Shuffle 是实现过程中最消耗时间的部分(或许这就是为什么MapReduce不把Shuffle列出来的原因吧,笑)

简要说说三个阶段分别干了个什么事:

  • Map:映射,完成了数据分类

    每一台机器上的数据都是杂乱的,因此首先我们需要对数据进行分类,这就是map所完成的工作

  • Shuffle:完成了数据分发

    每台机器都会将分好类别的数据,依照类别分发到不同的下游服务器上,这个说法看似简单,但是却有很多坑:

    1.考虑网络的不稳定性,不一定每次分发都能成功,且多次网络链接

    2.每一次分发都代表着一次 io,而 io 代表着速度缓慢,同时存在大量序列化和反序列化操作

    3.面向多台服务器分发,意味着 io 的切换,这同样也会消耗大量的时间

    因此,Shuffle 可以说是批处理计算引擎中最消耗时间的部分

  • reduce:规约,应该就是对完成分类的数据进行处理

    reduce也有简化的意思,我认为这个阶段就是完成计算汇总,可能存在存盘之类的操作

Shuffle 算子分类

  • repartition:重新改变分区

    coalesce,repartition

  • ByKey:key-value对,将key按照某种方式进行 聚合

    groupByKey,reduceByKey,aggregateByKey,combineByKey,sortByKey,sortBy

  • Join:将本身没有在一起的数据,按照某种条件放到一起进行计算,类似于SQL

    cogroup,join,leftOuterJoin,intersection,subtract,subtractByKey

  • Distinct:去重

    distinct

宽窄依赖

补充一下RDD是什么:

Resilient Distributed Dataset,容错的,可以并行执行的分布式数据集,其实这个在上一篇笔记中提到过

窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖

宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖

其他

其他的我就基本不怎么能听懂了,太多大数据的"行业黑话",总之大致涉及了shuffle 的依赖结构,shuffle 触发流程(这个大致和java流操作类似,必须要一个终止操作才会执行)

最后是讲了一些 nio 相关的知识,虽然 nio 比较难,但是好歹是接触过的领域,大致说明了 io 发展中操作系统做出了功能上的更新,使得DMA(Direct Memory Access直接存储器存取)性能得到了优化;然后说明了零拷贝技术的使用堆外内存,绕过java虚拟机,减少序列化和反序列化,这个不涉及代码部分倒是能看懂...

\