第225讲:Spark Shuffle Pluggable框架SortShuffle解析以及创建源码详解
Spark Shuffle在最开始的时候,只支持Hash-Based Shuffle,而Hash-Based Shuffle默认Mapper阶段会为Reducer阶段的每一个Task,单独创建一个文件来保存该task中要使用的数据,但是在一些情况下(例如数据量非常大的情况)会造成大量文件(M*R,M代表Mapper中的所有的并行任务数量,R代表Reducer中所有的并行任务数量)的随机磁盘IO操作,且会形成大量的memory消耗,极易造成OOM,这是致命的问题,第一不能处理大规模的数据,第二Spark不能运行在大规模的分布式集群上!后来的方案是加入了Shuffle Consolidate机制来将Shuffle时候产生的文件数量减少到C*R个(C代表在Mapper端同时能够使用的cores的数量,R代表Reducer中所有的并行任务数量),但是此时如果Reducer端的并行数据分片(或者任务)过多的话,则C*R可能依旧过大,此时依旧没有逃脱文件打开过多的厄运;Spark(Spark 1.1版本之前)在引入Sort-Based Shuffle之前,比较适用于中小规模的大数据处理。 为了让Spark在更大规模的集群上更高性能的处理更大规模的数据,于是就引入了Sort-Based Shuffle(Spark1 1.1版本开始),Spark可以胜任任意规模(包含PB级别及PB以上的级别)大数据的处理,尤其是随着钨丝计划的引入和优化,把Spark更快速的在更大规模的集群处理更海量的数据的能力推向了一个巅