MapReduce運行原理和過程

 

原文html

一.Map的原理和運行流程

 

Map的輸入數據源是多種多樣的,咱們使用hdfs做爲數據源。文件在hdfs上是以block(塊,Hdfs上的存儲單元)爲單位進行存儲的。算法

1.分片緩存


咱們將這一個個block劃分紅數據分片,即Split(分片,邏輯劃分,不包含具體數據,只包含這些數據的位置信息),那麼上圖中的第一個Split則對應兩個個文件塊,第二個Split對應一個塊。須要注意的是一個Split只會包含一個File的block,不會跨文件框架

 

 2. 數據讀取和處理函數

 

當咱們把數據塊分好的時候,MapReduce(如下簡稱mr)程序將這些分片以key-value的形式讀取出來,而且將這些數據交給用戶自定義的Map函數處理。優化

 

3.spa

用戶處理完這些數據後一樣以key-value的形式將這些數據寫出來交給mr計算框架。mr框架會對這些數據進行劃分,此處用進行表示。不一樣顏色的partition矩形塊表示爲不一樣的partition,同一種顏色的partition最後會分配到同一個reduce節點上進行處理。線程

Map是如何將這些數據進行劃分的?翻譯

默認使用Hash算法對key值進行Hash,這樣既能保證同一個key值的數據劃分到同一個partition中,又能保證不一樣partition的數據梁是大體至關的。3d

 

總結

1.一個map指揮處理一個Split    

2.map處理完的數據會分紅不一樣的partition

3.一類partition對應一個reduce

那麼一個mr程序中 map的數量是由split的數量決定的,reduce的數量是由partiton的數量決定的。

 

二.Shuffle

Shuffle,翻譯成中文是混洗。mr沒有排序是沒有靈魂的,shuffle是mr中很是重要的一個過程。他在Map執行完,Reduce執行前發生。

 

 

Map階段的shuffle

數據通過用戶自定的map函數處理完成以後,數據會放入內存中的環形緩衝區以內,,他分爲兩個部分,數據區和索引區。數據區是存放用戶真實的數據,索引區存放數據對應的key值,partition和位置信息。當環形緩衝區數據達到必定的比例後,會將數據溢寫到一個文件之中,即途中的spill(溢寫)過程。

在溢寫前,會將數據根據key和partition進行排序,排好序以後會將數據區的數據按照順序一個個寫入文件之中。這樣就能保證文件中數據是按照key和parttition進行排序的。最後會將溢寫出的一個個小文件合併成一個大的文件,而且保證在每個partition

中是按照Key值有序的。

總結:

  1.  Collect階段將數據放進環形緩衝區,緩衝區分爲數據區和索引區。
  2. Sort階段對在同一partition內的索引按照key排序。
  3. Spill階段跟胡排好序的索引將數據按照順序寫到文件中。
  4. Merge階段將Spill生成的小文件分批合併排序成一個大文件。

Reduce階段的shuffle

reduce節點會將數據拷貝到本身的buffer緩存區中,當緩存區中的數據達到必定的比例的時候,一樣會發生溢寫過程,咱們任然要保證每個溢寫的文件是有序的。與此同時,後臺會啓一個線程,將這些小文件合併成一個大文件,通過一輪又一輪的合併,最後將這些文件合併成一個大的數據集。在這個數據集中,數據是有序的,相同的key值對應的value值是挨在一塊兒的。最後,將這些數據交給reduce程序進行聚合處理。

總結:

  1. 1.      Copy階段將Map端的數據分批拷貝到Reduce的緩衝區。
  2. 2.      Spill階段將內存緩存區的數據按順序寫到文件中。
  3. 3.      Merge階段將溢出的文件合併成一個排序的數據集。

 

三.Reduce運行過程

 

 

在map處理完以後,reduce節點會將各個map節點上屬於本身的數據拷貝到內存緩衝區中,最後將數據合併成一個大的數據集,而且按照key值進行聚合,把聚合後的value值做爲iterable(迭代器)交給用戶使用,這些數據通過用戶自定義的reduce函數進行處理以後,一樣會以key-value的形式輸出出來,默認輸出到hdfs上的文件。

四.Combine優化

咱們說mr程序最終是要將數據按照key值進行聚合,對value值進行計算,那麼咱們是否是能夠提早對聚合好的value值進行計算?of course,咱們將這個過程稱爲Combine。哪些場景能夠進行conbine優化。以下。

Map端:

1. 在數據排序後,溢寫到磁盤前,運行combiner。這個時候相同Key值的value值是挨在一塊兒的,能夠對這些value值進行一次聚合計算,好比說累加。

2. 溢寫出的小文件合併以前,咱們也能夠執行一次combiner,須要注意的是mr程序默認至少存在三個文件才進行combiner,不然mr會認爲這個操做是不值得的。固然這個值能夠經過min.num.spills.for.combine設置。

Reduce端:

  1. 和map端同樣,在合併溢出文件輸出到磁盤以前,運行combiner

 

 送上整個MR過程圖

相關文章
相關標籤/搜索