未经优化的HashShuffle
上游stage的task对相同的key执行hash算法,从而将相同的key写到一个磁盘文件中,而每个磁盘文件都只属于下游stage的一个task,这就导致了下游有几个task上有就要创建多少个磁盘小文件,当下游的task任务过多的时候,上游就会堆积磁盘小文件
优化的HashShuffle
spark.shuffle.consolidateFiles=true
当开启上面的配置的时候,spark使用的是优化的HashShuffle。每个shuffleFileGroup会对应一批磁盘文件,数量与下游stage的task数量相同。一个executor上有多少个CPU核数,就可以并行执行多少个task,而第一批并行执行的task,每个task就会创建一个shuffleFileGroup,并写入数据到磁盘文件中,下一批task会复用之前已有的shuffleFileGroup,包括其中的磁盘文件。
SortShuffleManager普通运行机制
该模式下,数据会先写到一个内存数据结构中,根据不同的算子,可能选用不同的数据结构,如果是reduceBykey这种聚合类的算子,那么会选用Map数据结构,一边通过Map进行聚合,一边写入内存,如果是join类的shuffle算子,那么会选用Array数据结构,直接写入内存。每写一条到内存中,就会判断一下,是否达到某个阈值,当达到阈值是,会尝试把内存中的数据写入磁盘,然后清空数据结构。在溢写磁盘之前,