一: 为何须要Sort-Based Shuffle? 1.Shuffle通常包含两个阶段:第一部分,产生Shuffle的阶段(也叫Map阶段),第二阶段,使用Shuffle数据的阶段(也叫Reduce阶段) 2.Spark的Job会被划分红不少Stage,若是只有一个Stage则这个Job就只有一个Mapper,固然不会产生Shuffle,适合ETL。 若是不止一个Stage,最后一个Stage就是最终的Reduce,最左侧的Stage就仅仅是整个Job的Mapper,中间全部的任意一个 Stage是其父Stage的Reducer,其子Stage的Mapper 3.Spark Shuffle在最开始的时候只支持Hash-base Shuffle:默认Mapper阶段会为Reducer阶段的每个Task单首创建一个 文件来保存该Task中要使用的数据,可是在一些状况下(例如数据量很是大的状况)会形成数据文件(M*R M:Mapper端的并 行任务数,R:Reducer端的并行任务数)的随机磁盘I/O操做,且会造成大量的Memory消耗(极易形成OOM),后来改善方式 是加入了Shuffle Consolidate机制来将Shuffle时候产生文件的数量减小到C*R个(C:Mapper端同时可以使用Cores的数 量,R:Reducer端的并行任务数)。若是此时Reducer端的并行任务数过多,依旧没有逃脱文件过多的命运