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