第24课:彻底解密Shuffle是如何成为Spark性能杀手的及调优点思考
人们对于Spark的第一印象是往往是Spark基于内存进行计算。但从实质上讲,Spark基于内存进行计算,也可以基于磁盘进行计算,或者基于第三方的存储空间进行计算。背后两层含义:1,Spark架构框架的实现模式是倾向于在内存中计算数据的,可以从Storage、算法、库的不同方式看出来。2,我们要计算数据的时候,数据就在内存中。Shuffle和Spark完全基于内存的计算愿景是相违背的,Shuffle就变成了Spark的性能杀手,从现在的计算机硬件和软件的发展水平来看,这个是不可抗拒的。
Shuffle 不可以避免是因为在分布式系统中把一个很大的的任务/作业分成一百份或者是一千份文件,这一百份或一千份文件在不同的机器上独自完成各自不同的部份,完成之后针对整个作业要结果,在后面进行汇聚,从前一阶段到后一阶段及网络传输的过程就叫 Shuffle。
在 Spark 中为了完成 Shuffle 的过程会把一个作业划分为不同的Stage,这个Stage 的划分是跟据依赖关系去决定的,Shuffle 是整个 Spark 中最消耗性能的地方。大家想一下,如果没有Shuffle,Spark几乎可以完成一个纯内存的操作,因为不需要网络传输,又有迭代的概念,那数据每次在内存中计算,如内存不够也可以每次算一点,完成纯内存的操作。
那Shuffle如何破坏了这一点?因为在不同机器不同节点上我们要进行数据传输,例如reduceByKey,它会把每个Key对应的Value聚合成一个 value,然后生成新的 RDD。下游Stage的Task拿到上一个Stage相同的key,然后进行Value的reduce