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計算使用。遠程