Spark中shuffle过程由ShuffleRDD触发。
shuffle的数据包含读取和写入两种操作,在一个SparkContext中,所有的shuffleRDD具有一个递增的shuffleID来唯一标识Shuffle数据对应的RDD及Partition。
Spark集群中由MapOutTracker来跟踪Shuffle数据的位置,MapOutTracker有两个子类:MapOutTracker和MapOutTrackerSlaver。Slaver汇报自己节点机器上的MapStatus给Master,通过RPC过程就能获取全局的MapStatus信息,这样每个ShuffleTask也就知道了对应的shuffleId的数据存储在哪个机器上。
数据的存储通过ShuffleManager来管理,它会通过ShuffleReader和ShuffleWrite来负责读写两个过程。具体的数据存储是通过BlockManager来完成的,这里不再详细论述BlockManager的功能。
ShuffleManager操作数据的时候,首先根据MapOutTracker机制获取ShuffleId的位置,然后启动Fetch过程从本地或远程拉取数据,组装成Iterator[Any]格式供RDD计算使用,具体其实是通过ShuffleBlockFetcherIterator来实现的。
概括一下,ShuffleManager、MapOutTracker等都是管理的Shuffle数据的元数据,真实数据的操作是通过BlockManager来实现的,ShuffleBlockFetcherIterator是一个中间类,用来生成Iterator[Any]给RDD的partition计算使用。