ShuffleManager
在Spark框架中,Shuffle阶段的设计优劣是决定性能好坏的关键因素之一。实现一个优良的ShuffleManager,减少不必要的Shuffle开销至关重要。
在MapReduce框架中,Shuffle阶段是连接Map和Reduce之间的桥梁,Map阶段通过Shuffle过程将数据输出到Reduce阶段中。由于Shuffle涉及十分密集的磁盘的读写和网络I/O,因此Shuffle性能的高低直接影响整个程序的性能。Spark本质上与MapReduce框架十分相似,因此也有自己的Shuffle过程实现。
在Driver和每个Executor的SparkEnv实例化过程中,都会创建一个ShuffleManager,用于管理块数据,提供集群块数据的读写,包括数据的本地读写和读取远程RDD结点的块数据。在RDD间存在宽依赖时,需要进行Shuffle操作,此时便需要将Spark作业(Job)划分成多个Stage,并在划分Stage的关键点———构建ShuffleDependency时———利用ShuffleManager进行Shuffle注册,获取后续数据读写所需的ShuffleHandle。
ShuffleManager中的shuffleBlockResolver是Shuffle的块解析器,该解析器为数据块的读写提供支撑层,便于抽象具体的实现细节。基于此,有宽依赖关系的RDD执行compute时就可以读取上一Stage为其输出的Shuffle数据,并将计算结果传入下一stage。[^spark_optimize]
在Vega中,只实现了最基础的HashShuffleManager,而没有实现性能更高的SortShuffleManager,这是极为明显的可以优化的点
[^spark_optimize]王家林.Spark内核机制解析及性能调优.2017.