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个

posted on 2016-08-05 11:30  杰克再造  阅读(741)  评论(0编辑  收藏  举报

导航