众所周知,Spark计算引擎,是在Hadoop MapReduce的基础之上进行了优化,已达到提升计算性能的目的。Spark与MapReduce一脉相承,在计算当中,也就涉及到Map阶段和Reduce计算。今天的大数据开发分享,我们就来具体讲一讲Spark Shuffle。
Shuffle概念解读
Shuffle最早出现于MapReduce框架中,负责连接Map阶段的输出与Reduce阶段的输入。Shuffle阶段涉及磁盘IO、网络传输、内存使用等多种资源的调用,所以Shuffle阶段的执行效率影响整个作业的执行效率,大部分优化也都是针对Shuffle阶段进行的。
在Spark作业中,Map阶段的Shuffle称为Shuffle Write,Reduce阶段的Shuffle称为Shuffle Read。
Shuffle Write阶段会将Map Task中间结果数据写入到本地磁盘,而在Shuffle Read阶段中,Reduce Task从Shuffle Write阶段拉取数据到内存中并行计算。
Shuffle Write实现方式
(1)基于Hash的实现(hash-based)
每个Map Task都会生成与Reduce Task数据相同的文件数,对Key取Hash值分别写入对应的文件中。
基于Hash的实现方式的优缺点:
优点:实现简单,小数量级数据处理操作方便。
缺点:产生小文件过多,内存利用率低,大量的随机读写造成磁盘IO性能下降。
(2)基于Sort的实现方式(sort-based)
为了解决基于Hash的实现方式的诸多问题,Spark Shuffle引入了基于Sort的实现方式。基于sort的实现方式,每个Map Task任务生成两个文件,一个是数据文件,一个是索引文件,生成的文件数FileNum=MapTaskNum×2。
基于Sort的实现方式的优缺点:
优点:顺序读写能够大幅提高磁盘IO性能,不会产生过多小文件,降低文件缓存占用内存空间大小,提高内存使用率。
缺点:多了一次粗粒度的排序。
Shuffle Read实现方式
Shuffle Read阶段中Task通过直接读取本地Shuffle Write阶段产生的中间结果数据或者通过HTTP的方式从远程Shuffle Write阶段拉取中间结果数据进行处理。
Shuffle Write阶段基于Hash和基于Sort两种实现方式产生的中间结果数据在Shuffle Read阶段采用同一种实现方式。获取需要拉取的数据信息,根据数据本地性原则判断采用哪种级别的拉取方式。
今天的大数据开发分享,Spark Shuffle详解,以上就为大家做了大致的介绍了。在大数据学习当中,Spark Shuffle要理解透彻,才能对于Spark的计算运行机制有更好的理解。