spark的shuffle从最开始的basic HashShuffle的M*R个中间文件,到优化的consalidate方式的C*R个中间文件。但他们的缺点还是太明显,在面对数据量巨大的集群运算会产生巨多的中间文件。大量的读取操作且会占用大量的Memory(易造成OOM)。所以在spark 2.0之后remove了HashShuffle,开始只使用on-heap或off-heap的sort-based shuffle。
SparkEnv.scala它产生的中间文件为2*M个,其中M个shuffle output的data文件,M个记录Index文件。
index文件是根据task生成的目标partition id进行排序的(data并没有排序)。
SortShuffleManager.scalaSort-based shuffle也分为两种:
一种是序列化的排序:
1.shuffle依赖不能有聚合和输出排序操作
2.shuffle序列化支持序列化过的值的迁移操作
3.shuffle产生的partitions不能超过16777216个
一种是反序列化的排序,以上3个条件之外的情况都用这个去处理。
好处呢就是:
网友评论