Shuffle 是数据从map端到reduce数据流转的一种形式,当发生join、groupby等操作的时候,父类数据将会根据key进行shuffle write当本地,然后reduce根据相同key进行shuffle read,这样就产生了同一个父RDD可能存在于多个子RDD中。
在这个过程中主要有两种shuffle形式,hashshuffle是很早之前的一种方案,在map段进行shuffle write的时候,会产生大量的小文件,这会造成大量的IO开销,很容易造成找不到文件而报错,这时只能重跑stage。
在spark 新版本中,引入了sortshuffle。这种机制默认会对map段shuffle write进行排序汇总并生成索引。下游reduce 在拉取数据的时候会根据索引拉取对应的文件。同时,sortshuffle也支持bypass,通过这种机制,可以避免map端不必要的排序,提高效率。