MapReduce介紹

原文鏈接: http://blog.csdn.net/amuseme_lu/article/details/4788820

 

Introduction
-------------
MapReduce是一個最先由Google提出的分佈式計算軟件構架,它可以支持大數據量的分佈式處理。這個架構最初起源於函數式程式的map和reduce兩個函數組成,但它們在MapReduce架構中的應用和原來的使用上的大相徑庭。

OverView
---------
MapReduce架構是用來解決大數據量的分佈式計算問題,然後把計算後的結果放入文件系統或者數據庫中。

"Map":主結點讀入輸入數據,把它分成可以用相同方法解決的小數據塊(這裏是一個分而治之的思想),然後把這些小數據塊分發到不同的工作節點上(worder nodes)上,每一個工作節點(worder node)循環做同樣的事,這就行成了一個樹行結構(分佈式計算中的很多模型都和圖論有關,pageRank也是),而每一個葉子節點有來處理每一個具體的小數據塊,再把這些處理結果返回給父節點。

"Reduce":主結節得到所有子節點的處理結果,然後把所有結果組合並且返回到輸出。

MapReduce的一個特點是可以用map和reduceion方法來處理分佈式計算的問題(這裏有一個移動計算而不是移動數據的概念,因爲移動計算比移動數據代價更小)。這裏的每一個mapping操作都是相對獨立的,所有的maps都是並行運行的,雖然實踐中會受到數據源和cpu個數的影響。同樣的,這裏用一個reducer集合來執行reduction操作,所有帶有相同key的map輸出會聚集到同一個reducer。雖然這個過程看上去沒有串行計算來得高效,但是MapReduce能夠處理一般服務器所不能處理的大數據量處理問題。大型的服務器集羣可以在幾個小時內處理petabyte數據量的排序問題。而並行處理可以提供部分容錯和出錯恢復的功能。當一個mapper或reducer失效時,整個工作就會被重新安排,從而不會影響工作的連續性。

Logical view
------------
MpaReduce的Map和Reduce過程都定義了數據結構(key,value)對,Map操作在一個數據域中用一種類型表達一個數據對,然後在另一個不同的域中返回一個數據隊列:
Map(k1,v1) -> list(k2,v2)
Map過程並行應用於每一個輸入的數據集,每一次調用都會產生一個(k2,v2)的隊列。然後,MapReduce構架收集輸出隊列中有相同key的數據對,把它們聚集在一起,因爲構建了一個不同key的數據對集合。

Reduce方法應用於上面產生的每一個數據對集合,從而產生相同域中的數據集合。
Reduce(k2,list(v2)) -> list(v3)
每一個被調用的Reduce方法產生一個v3數據集或者一個空集,這裏也可以返回多個value。所有返回的調用結果組成一個結果隊列。

Example
---------
void map(String name, String document):
  // name: document name
  // document: document contents
  for each word w in document:
    EmitIntermediate(w, 1);

void reduce(String word, Iterator partialCounts):
  // word: a word
  // partialCounts: a list of aggregated partial counts
  int result = 0;
  for each pc in partialCounts:
    result += ParseInt(pc);
  Emit(result);

這裏,每一個文檔被分成了一個個詞,通過調用Map方法,每一個詞都初始化的個數爲1。MapReduce架構把所有相同的詞聚合在一起,把它們傳送給Reduce,Reduce計算所有同相詞的出現個數。

Dataflow
--------
MapReduce架構的操作模塊:
1. 輸入流模塊:輸入模塊負責把輸入數據分成16MB或者128MB的小數據塊,然後把它們傳給Map模塊
2. Map模塊:Map模塊得到每一個key/value對,處理後產生一個或多個key/value對。這裏的輸入key/value對與輸出key/value對是不一樣的。
3. Partition模塊:它用於負責把上面輸出的key映射到不同的reduce方法中去
4. comapre模塊:對reduce所讀入的數據進行比較
5. Reduce模塊:對上面已經排好序的並且帶有相同key的數據進行迭代計算
6. 輸出模塊:把reduce的輸出結果寫到存儲系統中去,一般都會用分佈式文件系統,如GFS

Distribution and reliability
----------------------------
MapReduce通過把大工作分成不同的小工作再分發給不同的工作者來實現數據的可靠性。每一個單獨的工作者處理分發的工作,然後把結果和狀態返回給父節點。如果一個節點失效了,主節點會發現和記錄這個失效的節點,把分配給這個節點的工作再分發給別的節點。

而實踐中也不一定都是高可靠性的,如Hadoop的NameNode是一個單節點的文件系統,一但JobTracker失效,所有的工作都會丟失。

Educational Courses
--------------------

    * Cluster Computing and MapReduce course from Google Code University contains video lectures and related course materials from a series of lectures that was taught to Google software engineering interns during the Summer of 2007.
    * MapReduce in a Week course from Google Code University contains a comprehensive introduction to MapReduce including lectures, reading material, and programming assignments.
    * MapReduce course, taught by engineers of Google Boston, part of 2008 Independent Activities Period at MIT.
    * Cloudera's Hadoop Course, taught by Ex-Google Employees and other Apache Hadoop Project Committers

發佈了65 篇原創文章 · 獲贊 19 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章