Spark深入学习大数据,机器学习,人工智能spark

Spark Shuffle的技术演进

2017-02-15  本文已影响2267人  LeonLu

在Spark或Hadoop MapReduce的分布式计算框架中,数据被按照key分成一块一块的分区,打散分布在集群中各个节点的物理存储或内存空间中,每个计算任务一次处理一个分区,但map端和reduce端的计算任务并非按照一种方式对相同的分区进行计算,例如,当需要对数据进行排序时,就需要将key相同的数据分布到同一个分区中,原分区的数据需要被打乱重组,这个按照一定的规则对数据重新分区的过程就是Shuffle(洗牌)

Spark Shuffle的两阶段

对于Spark来讲,一些Transformation或Action算子会让RDD产生宽依赖,即parent RDD中的每个Partition被child RDD中的多个Partition使用,这时便需要进行Shuffle,根据Record的key对parent RDD进行重新分区。如果对这些概念还有一些疑问,可以参考我的另一篇文章《Spark基本概念快速入门》

以Shuffle为边界,Spark将一个Job划分为不同的Stage,这些Stage构成了一个大粒度的DAG。Spark的Shuffle分为Write和Read两个阶段,分属于两个不同的Stage,前者是Parent Stage的最后一步,后者是Child Stage的第一步。如下图所示:


执行Shuffle的主体是Stage中的并发任务,这些任务分ShuffleMapTask和ResultTask两种,ShuffleMapTask要进行Shuffle,ResultTask负责返回计算结果,一个Job中只有最后的Stage采用ResultTask,其他的均为ShuffleMapTask。如果要按照map端和reduce端来分析的话,ShuffleMapTask可以即是map端任务,又是reduce端任务,因为Spark中的Shuffle是可以串行的;ResultTask则只能充当reduce端任务的角色。

我把Spark Shuffle的流程简单抽象为以下几步以便于理解:

Write阶段发生于ShuffleMapTask对该Stage的最后一个RDD完成了map端的计算之后,首先会判断是否需要对计算结果进行聚合,然后将最终结果按照不同的reduce端进行区分,写入当前节点的本地磁盘。
Read阶段开始于reduce端的任务读取ShuffledRDD之时,首先通过远程或本地数据拉取获得Write阶段各个节点中属于当前任务的数据,根据数据的Key进行聚合,然后判断是否需要排序,最后生成新的RDD。

Spark Shuffle具体实现的演进

在具体的实现上,Shuffle经历了Hash、Sort、Tungsten-Sort三阶段:

Spark Shuffle源码结构

这里以最新的Spark 2.1为例简单介绍一下Spark Shuffle相关部分的代码结构

参考资料及推荐阅读

  1. Spark 1.0之前Hash Based Shuffle的原理
  1. Spark 1.1时Sort Based Shuffle的资料
  1. Spark 1.2之前两种Shuffle方式的分析和对比
  1. Spark 1.6之前三种Shuffle方式的分析和对比
  1. Spark 1.6之前Sort Based Shuffle的源码和原理
  1. Spark 1.6之前Tungsten-sort Based Shuffle的原理
上一篇 下一篇

猜你喜欢

热点阅读