Hadoop源代碼分析(MapReduce概論)

大家都熟悉文件系統,在對HDFS進行分析前,我們並沒有花很多的時間去介紹HDFS的背景,畢竟大家對文件系統的還是有一定的理解的,而且也有很好的文檔。在分析Hadoop的MapReduce部分前,我們還是先了解系統是如何工作的,然後再進入我們的分析部分。下面的圖來自http://horicky.blogspot.com/2008/11/hadoop-mapreduce-implementation.html,是我看到的講MapReduce最好的圖。

 

以Hadoop帶的wordcount爲例子(下面是啓動行):
hadoop jar hadoop-0.19.0-examples.jar wordcount /usr/input/usr/output
用戶提交一個任務以後,該任務由JobTracker協調,先執行Map階段(圖中M1,M2和M3),然後執行Reduce階段(圖中R1和R2)。Map階段和Reduce階段動作都受TaskTracker監控,並運行在獨立於TaskTracker的Java虛擬機中。
我們的輸入和輸出都是HDFS上的目錄(如上圖所示)。輸入由InputFormat接口描述,它的實現如ASCII文件,JDBC數據庫等,分別處理對於的數據源,並提供了數據的一些特徵。通過InputFormat實現,可以獲取InputSplit接口的實現,這個實現用於對數據進行劃分(圖中的splite1到splite5,就是劃分以後的結果),同時從InputFormat也可以獲取RecordReader接口的實現,並從輸入中生成<k,v>對。有了<k,v>,就可以開始做map操作了。
map操作通過context.collect(最終通過OutputCollector. collect)將結果寫到context中。當Mapper的輸出被收集後,它們會被Partitioner類以指定的方式區分地寫出到輸出文件裏。我們可以爲Mapper提供Combiner,在Mapper輸出它的<k,v>時,鍵值對不會被馬上寫到輸出裏,他們會被收集在list裏(一個key值一個list),當寫入一定數量的鍵值對時,這部分緩衝會被Combiner中進行合併,然後再輸出到Partitioner中(圖中M1的黃顏色部分對應着Combiner和Partitioner)。
Map的動作做完以後,進入Reduce階段。這個階段分3個步驟:混洗(Shuffle),排序(sort)和reduce。
混洗階段,Hadoop的MapReduce框架會根據Map結果中的key,將相關的結果傳輸到某一個Reducer上(多個Mapper產生的同一個key的中間結果分佈在不同的機器上,這一步結束後,他們傳輸都到了處理這個key的Reducer的機器上)。這個步驟中的文件傳輸使用了HTTP協議。
排序和混洗是一塊進行的,這個階段將來自不同Mapper具有相同key值的<key,value>對合併到一起。

Reduce階段,上面通過Shuffle和sort後得到的<key, (list of values)>會送到Reducer. reduce方法中處理,輸出的結果通過OutputFormat,輸出到DFS中。

更多精彩內容請關注:http://bbs.superwu.cn 

關注超人學院微信二維碼:

關注超人學院java免費學習交流羣:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章