【Spark四十八】Spark Shuffle第二部分:Spark Shuffle概述

Spark Shuffle概述

1. Spark 提供了两种Shuffle方式 hash-based和sort based。可以通过spark.shuffle.manager参数指定。在Spark1.2中,将shuffle的默认实现设置为了sort based

对于hash based shuffle,

  • Spark使用类似HashMap的数据结构来对 shuffle 来的数据进行 aggregate(相同的K,通过Map来aggregate)
  • 不会对数据进行提前排序。如果用户需要经过排序的数据,那么需要自己调用类似 sortByKey() 的操作

对于sort based shuffle

  • sort based shuffle会对数据进行排序

对于hash based shuffle和sort based shuffle,除了是否排序上的差异之外,还有就是map端产生的文件个数。

hash based shuffle的主要问题就是产生的文件数太多。

2. 在 Spark 中,没有像Hadoop Shuffle那样明确的阶段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蕴含在 transformation() 中。

3. Spark Shuffle可以分为两个阶段,Shuffle Write和Shuffle Read。map 端划分数据、持久化数据的过程称为 shuffle write,而将 reducer 读入数据、aggregate 数据的过程称为 shuffle read

4. Shuffle Write的任务

4.1 在ShuffleMapTask中对finalRDD产出的数据进行写操作。写操作会写到磁盘(而不是存放到内存中),一方面节省内存空间,另一方面也是为了容错。这就解释了相对于内存而言,很大量的数据做shuffle的时候,不会出现内存不够的情况。

4.2 每个Partition处理完(即ShuffleMapTask执行完),需要告知MapOutputTrackerMaster它产出的数据存放在那里,以供Reducer消费。

4.3 不同的RDD算子,比如reduceByKey,会使用Map端的combine操作,将数据进行提前combine;而有些算子,如groupByKey,则不使用Map的combine操作。

4.4 对于hash based shuffle,shuffle产生的分区数据不排序,而对于sort based shuffle则会对分区数据进行排序

5. Shuffle Read的任务

5.1从MapOutputTrackerMaster上获取属于它处理的Map输出的数据,这里可能涉及fetch remote

5.2 获取到所有的Map产出的数据后,会做一个总aggregate?



猜你喜欢

转载自bit1129.iteye.com/blog/2184276