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>對合併到一塊兒。
html

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

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

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

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

相關文章
相關標籤/搜索