将数据打乱重新分配到不同节点上的过程就是shuffle。Shuffle的目的就是将具有共同的特征的数据汇聚在同一个节点上来处理,比如hadoop的reduce还有排序等作用。当然并不是所有的shuffle过程都有排序,甚至为了减少排序带来不必要的开销,spark最初的框架中用的Hash Based Shuffle Write就是这样设计的,没有排序。
Spark集群Shuffle分为2部分:Mapper端和Reducer端。Mapper端:通过Cache不断的把数据写入到文件系统中并汇报给Driver。Reducer端:把相同的Key放在同一个Task中,并进行业务逻辑的操作。Reducer端抓数据的时候也有一个小的缓存区。Mapper端有一个缓存,根据Redcuer端的需要,对数据分成不同的部分,然后在Reducer端抓到属于自己的数据进行reduce操作,把相同Key的数据Pull过来以后进行reduce操作。
1.Hash Based Shuffle Write
其实在很多计算场景中并不需要排序,排序后反而会带来一些不必要的开销。Executor上执行Shuffle Map Task时调用RunTask,从sparkEnv中获取到manager,从manager中获取write,将对RDD计算的中间结果持久化,就是在本地存起来,这样下游的Task直接调用中间结果就可以了,之前也提到过这样也拥有了不错的容错机制,恢复数据的时候不必要重新计算所有的RDD。当然map端也可以对中间的结果进行一些操作,比如聚合等,然后再存入本地,以便之后的Task进行调用。
这里有一个重要的实现也最终成为Hash Bashed Shuffle Write被替换掉默认选项的原因,就是每个Shuffle Map Task对每一个下游的partition都生成一个