第226讲:Spark Shuffle Pluggable框架SortShuffle具体实现解析
SortShuffle在进行ShuffleMapTask的时候,按照Key(具体的处理元素的key)相应的PartitionID进行sort,注意这个进行sort,很消耗性能,为了避免Hadoop Map reduce sort 的弊端,Spark的处理是对于属于同一个Partition的Key不进行sort排序。这样就极大的提升了性能。(但是Hadoop Map Reduce的mapper对相同的key进行排序,先进行排序)。那Spark SortByKey怎么进行sort呢?这个是在Reduce中进行排序。 ShuffleMapTask端有很多的ShuffleMapTask, 整个过程只会生成一个文件, 因此有文件索引,如果内存不够,排序好的数据将溢出到外部存储,然后将文件进行归并排序,由于是一个文件因此使用index,下一个阶段的task根据index读取不同的partition使用的数据。
ExternalSorter :对于每个partition,实质上会创建一个数组Array,数组会包括Key-value,每一个待处理的key-value将插入相应的Array里面,如果Array超过了大小,那就将内存的数据写入到外部目录,文件的开始部分记录partitionID和文件保存了多少数据的信息, 最后进行排序,将写入外部文件的数据进行归并排序,将打开很多文件,推荐打开10-100文件,就会有index文件