Spark Shuffle源码分析系列之Shuffle介绍&演进过程

本文详细介绍了Spark Shuffle的过程,包括Shuffle的定义、Stage与Shuffle的关系、常见Shuffle算子,以及Spark Shuffle的演进历史,从Hash Based Shuffle到Sort Based Shuffle的改进,探讨了其性能优化策略。
摘要由CSDN通过智能技术生成

Shuffle是什么

spark源码分析之stage生成中,我们讲到Spark在DAGSchduler阶段会将一个Job划分为多个Stage,在上游Stage做map工作,下游Stage做reduce工作,其本质上还是MapReduce计算框架。Shuffle是连接map和reduce之间的桥梁,它将map的输出对应到reduce输入中,这期间涉及到序列化反序列化、跨节点网络IO以及磁盘读写IO等,所以说Shuffle是整个应用程序运行过程中非常昂贵的一个阶段,理解Spark Shuffle原理有助于优化Spark应用程序。

Shuffle&Stage

Stage划分&与Shuffle关系

Spark Stage是根据对parent rdd的依赖的种类进行划分的,如下图所示:
在这里插入图片描述

  1. 窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区,如上图中的C->D; D->F; E->F
  2. 宽依赖(Shuffle依赖)是指父RDD的每个分区可能会被下游RDD的一个或者多个分区所使用,如上图中的A->B, B,F->G。

宽依赖是划分Stage的重要标志,划分出来的两个Stage,上一个Stage执行的是Shuffle的Map操作,下一个Stage执行的是Shffule的Reduce操作,所以上面依赖的整个执行过程如下图所示:
在这里插入图片描述
总结起来:宽依赖划分了Stage,中间涉及了Shuffle过程,前一个stage的通过ShuffleMapTask进行Shuffle write, 把数据存储在blockManager上面, 并且把数据位置元信息上报到driver的mapOutTrack组件中,下一个stage根据数据位置元信息,进行 shuffle read,拉取上个stage的输出数据,进行数据处理。

常见Shuffle算子

Spark中常见的Shuffle算子有以下几类:

  1. 去重: distinct
  2. 聚合: reduceByKey,groupBy,groupByKey,aggregateByKey,combineByKey,sortByKey
  3. 重分区:coalesce,repartition
  4. 集合或者表操作:intersection,subtract,join

当然判断是否为shuffle,最好还是看debug出来的Lineage信息,看到中间过程有ShuffledRDD表明发生了Shuffle操作:

scala> val rdd = sc.parallelize(Array("hello world", "hah xx"
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值