1. 程式人生 > >MapReduce執行流程之我見

MapReduce執行流程之我見

     接下來就是啟動reduceTask執行task的過程了,reduce的輸入是map之後經過多次排序合併之後的結果,每一個reduce處理每一個mapper結果集中的一部分,而每一個mapper上的哪一部分交給哪一個reduce處理在mapper寫磁碟的時候就已經劃分好了,另外,mapper的結果是儲存在本地磁碟上的,而不是HDFS。我想這個原因應該是由於它是一些中間結果,沒有儲存的必要,另外,不同於mapper,在分配mapper的時候要考慮“移動計算而不是移動資料”的策略儘可能的將資料本地化進行計算,也就是說在第一步split(大多數情況下對於大檔案是一個block劃分為一個split)之後儘可能在儲存這個block副本的datanode上(同時它也是一個taskTracker)啟動mapper,這樣這個mapper的整個計算過程都不需要從網路上獲取輸入資料,大大節約了頻寬。但是對於reduce就不一樣了,因為它需要從多個節點上讀取資料(每一個mapper上都需要讀取一次),即使將這些中間結果儲存在HDFS上,也不能使得reduce的輸入在同一個datanode上。當然主要的原因應該還是第一點。另外,由於這些中間資料的可靠性並沒有保證,所以如果在mapper結束之後其中一個mapper磁碟掛掉了,資料丟失了,那麼還需要JobTracker重新進行排程計算,或者讓整個任務失敗(個人猜想,沒有證實具體的策略)。