第22课:Spark性能调优之使用更高性能算子及其源码剖析
Spark性能调优之使用更高性能算子的重要性在于同样的情况下,如果使用更高性能的算子,从算子级别给我们带来更高的效率。Spark现在主推的是DataSet这个API接口,越来越多的算子可以基于DataSet去做,DataSet基于天然自带的优化引擎,理论上讲比RDD的性能更高,DataSet弱点是无法自定义很多功能。平时使用来讲,使用的最基本是Shuffle的算子。Shuffle分为2部分:Mapper端和Reducer端。性能调优的准则是尽量不使用Shuffle类的算子,尽量避免Shuffle。在进行Shuffle的时候,将多个节点的同一个Key的数据汇聚到同样一个节点进行Shuffle的操作,基本思路是将数据放入内存中,内存中放不下的话就放入磁盘中。
如果要避免Shuffle,所有的分布式计算框架是产生Map端的Join,2个RDD进行操作,先把RDD的数据收集过来,然后通过SparkContext进行BroadCast广播出去,假设原先是RDD1、RDD2,我们把RDD2广播出去,原来是进行Join,Join的过程肯定是进行某种计算,此时RDD2其实已经不是RDD了,就是一个数据结构体包裹着数据本身,对RDD1进行Join操作,就是一条条遍历数据跟另一个集合里的数据产生某种算法操作。
如果不能避免Shuffle,我们退而求其次,需要更多的机器承担Shuffle的工作,充分利用Mapper端和Reducer端机器的计算资源,尽量让Mapper端承担聚合的任务。如果在Mapper端进行Aggregate的操作,在Mapper端的进程中就会把相同的Key进行合并。
(1)reduceByKe