Spark 的 hash shuffle 和 sort shuffle
Shuffle是MR的核心和最重要的地方,也是性能弹性最大的地方
在Spark中,1.1版本之前,框架默认采用的shuffle是hash,1.1之后,默认采用了sort
从下图可以看出在数据量小,mapper和reducer都比较小的时候,二者的性能几乎一样,当数据量大的情况下,sort shuffle的性能明显好一些
shuffle的中文意思是“洗牌”
在这里是将拥有一类特性的数据进行分类,成为有相同特征的数据汇聚到一个节点上,再进行后续的计算,这就是shuffle
这里讲的相同特征,就比如说key相同,或者key都满足小于10的条件等
对于hash shuffle
就是说对于数据的特征,分片策略采用hash code的方式来进行,简单暴力直接,如果后续的stage需要有10个reducer,那么直接按10取模,数据就分好了。
如果当前的stage的task是5,那么每个task会对应10个reducer,这样会将5个结果文件,分为50个小文件存储在磁盘上,后续的stage直接来取50个小文件就完毕,这是初级hash shuffle
这个带来的问题就是磁盘IO太多,内存可能溢出
所以一般会将50个结果文件进行一个consolidate,原则是产生当前executor的cpu数*10个文件,存储在磁盘,比如是2个core的机器,那么只产生20个文件,这就是优化的hash shuffle
对于sort shuffle
对生成的结果进行排序,然后生成小文件,再对小文件进行总的归并排序,生成一个大文件和一个索引文件,存储在磁盘上面
这样磁盘IO做到最小,索引文件保证了reducer的读取效率
所以生成的文件数量为2*mapper的task数量,在本文的例子中,就是2*5=10个