spark shuffle全过程源码梳理

本文详细梳理了Spark Shuffle的全过程,从理解宽窄依赖、Task分类到shuffle write和read的各个阶段,包括UnsafeShuffleWriter的工作原理、排序算法以及BlockStoreShuffleReader的流程。还探讨了内存管理和可能的溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解宽窄依赖

窄依赖(父RDD单个分区的计算不依赖于父RDD其他分区):

父RDD的一个Partition只能对应子RDD的一个Partition。即父RDD的一个分区上的数据可以单独计算。

换句话说,子RDD的某个分区在计算时可以单独计算而不会依赖于父RDD其他Partition上的数据。如Filter,map。

宽依赖(父RDD单个分区的计算依赖于父RDD其他分区):

父RDD的一个Partition无法单独计算,需要依赖于其他所有的Partition(依赖的不确定性)。表现为,shuffle read阶段,多个父RDD的数据,汇聚在同一个partition中计算。

Task分类:

分为ShuffleMapTask和ResultTask。

ShuffleMapTask需要将计算结果shuffle到下一个stage中。

ResultTask输出的则是result。

shuffle write:

总结起来:宽依赖划分了Stage,中间涉及了Shuffle过程,前一个stage的通过ShuffleMapTask进行Shuffle write, 把数据存储在blockManager上面, 并且把数据位置元信息上报到driver的mapOutTrack组件中,下一个stage根据数据位置元信息,进行 shuffle read,拉取上个stage的输出数据,进行数据处理。

https://blog.youkuaiyun.com/lidongmeng0213/article/details/106091148

ShuffleWriter类型

在shuffleMapTask的runTask方法中,获取shuffleWriter:

  override def getWriter[K, V](
      handle: ShuffleHandle,
      mapId: Int,
      context: TaskContext): ShuffleWriter[K, V] = {
   
    numMapsForShuffle.putIfAbsent(
      handle.shuffleId, handle.asInstanceOf[BaseShuffleHandle[_, _, _]].numMaps)
    val env = SparkEnv.get
    handle match {
   
      case unsafeShuffleHandle: SerializedShuffleHandle[K @unchecked, V @unchecked] =>
        new UnsafeShuffleWriter(
          env.blockManager
SparkShuffle是指在数据处理过程中,将数据重新分区和排序的过程。下面是Spark Shuffle全过程: 1. Map阶段:在Map阶段,每个Task会根据指定的分区规则将数据进行分区,并将分区后的数据写入临时磁盘文件中。 2. Shuffle阶段:在Shuffle阶段,每个Task会将自己的临时磁盘文件发送给对应的Reduce Task。这个过程中,数据会通过网络进行传输。 3. Reduce阶段:在Reduce阶段,每个Reduce Task会接收到来自不同Map Task的数据,并根据指定的分区规则进行合并和排序。最终,每个Reduce Task会生成一个或多个输出文件。 在Spark中,有两种Shuffle实现方式:HashShuffleManager和SortShuffleManager。 - HashShuffleManager:在Spark 1.2之前的版本中,默认的ShuffleManager是HashShuffleManager。它的特点是每个Task在进行Shuffle操作时会产生多个临时磁盘文件,但最后会将所有临时文件合并成一个磁盘文件。在下一个Stage的Shuffle Read Task拉取数据时,只需要根据索引读取每个磁盘文件中的部分数据即可。 - SortShuffleManager:从Spark 1.2版本开始,默认的ShuffleManager改为了SortShuffleManager。相较于HashShuffleManager,SortShuffleManager进行了一定的改进。每个Task在进行Shuffle操作时会产生较多的临时磁盘文件,但最后会将所有临时文件合并成一个磁盘文件。在下一个Stage的Shuffle Read Task拉取数据时,只需要根据索引读取每个磁盘文件中的部分数据即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值