MapReduce源於Google一篇論文,它充分借鑑了“分而治之”的思想,將一個數據處理過程拆分爲主要的Map(映射)與Reduce(歸約)兩步。簡單地說,MapReduce就是"任務的分解與結果的彙總"。
MapReduce (MR) 是一個基於磁盤運算的框架,賊慢,慢的主要原因:
1)MR是進程級別的,一個MR任務會創建多個進程(map task和reduce task都是進程),進程的創建和銷燬等過程需要耗很多的時間。
2)磁盤I/O問題, MapReduce作業通常都是數據密集型作業,大量的中間結果需要寫到磁盤上並通過網絡進行傳輸,這耗去了大量的時間。
注:mapreduce 1.x架構有兩個進程:
JobTracker :負責資源管理和作業調度。
TaskTrachker:任務的執行者。運行 map task 和 reduce task。
在2.x的時候由yarn取代他們的工作了。
MapReduce工作流程:
HDFS上的文件—>InputFormat—>Map階段—>shuffle階段(橫跨Mapper和Reducer,在Mapper輸出數據之前和Reducer接收數據之後都有進行)—>Reduce階段 —>OutputFormat —>HDFS:output.txt
InputFormat接口:將輸入數據進行分片(split),輸入分片的大小一般和hdfs的blocksize相同(128M)。
Map階段: Map會讀取輸入分片數據,一個輸入分片(input split)針對一個map任務,進行map邏輯處理(用戶自定義)
Reduce階段:對已排序輸出中的每個鍵調用reduce函數。reduce task 個數通過setNumReduceTasks設定,即mapreduce.job.reduces參數的默認值1。此階段的輸出直接寫到輸出文件系統,一般爲hdfs。
MapReduce Shffle詳解
爲了確保每個reducer的的輸入都是按鍵排序的,系統執行排序的過程,即將map task的輸出通過一定規則傳給reduce task,這個過程成爲shuffle。
Shuffle階段一部分是在map task 中進行的, 這裏成爲Map shuffle , 還有一部分是在reduce task 中進行的, 這裏稱爲Reduce shffle。