MapReduce端的二次排序以及對移動計算而不是移動資料的理解
1.其實MapReduce的二次排序是我們定義的sort排序會執行兩遍,第一遍是在map端執行,針對一個map任務的(當partition之後的將資料寫入到記憶體緩衝區的時候,達到記憶體緩衝區的80%的時候就會spill到disk,此時disk是作為硬碟快取的,所以我們的資料在硬碟上可以sort排序,而且在map執行完任務之後資料就不見了),那麼當程式執行到reduce之後,reduce端shuffle首先會將各個map端的資料都抓取到reduce端的記憶體緩衝區中,等達到記憶體緩衝區的80%的時候就會溢位到硬碟,硬碟作為記憶體緩衝區,在這裡會第二次執行我們寫的sort排序,也就是二次排序!這就是有名的二次排序!
2.不要再認為sort+group是二次排序了,group的作用就是一次性將同一組資料交給一個reduce任務處理!
3.這裡需要強調的是:map任務不是隨隨便便地分配給某個TaskTracker的,這裡有個概念叫:資料本地化(Data-Local)。意思是:將map任務分配給含有該map處理的資料塊的TaskTracker上,同時將程式JAR包複製到該TaskTracker上來執行,這叫“運算移動,資料不移動”。而分配reduce任務時並不考慮資料本地!
上面也就是說,移動計算而不是移動資料實際上是針對shuffle之前的map端而言的,而不是針對reduce端而言的!