MapReduce概述,原理,執行過程

來源:互聯網
上載者:User

標籤:

MapReduce概述

  MapReduce是一種分散式運算模型,運行時不會在一台機器上運行.hadoop是分布式的,它是運行在很多的TaskTracker之上的.
  在我們的TaskTracker上面跑的是Map或者是Reduce Task任務.
  通常我們在部署hadoop taskTracker 的時候,我們的TaskTracker同時還是我們的Datanode節點.datanode和tasktracker總是部署在一起的.

  MapReduce執行流程:

        

  為什麼要有多個datanode:

    因為我們的datanode是專門用來儲存資料的,我們的資料很大,在一個節點上是存不下的,存不下的情況下,我們就把資料存放在多個節點上.
  MapReduce:分散式運算模型.把我們的程式碼分到所有的tasktracker節點上去運行.只處理當前datanode上的資料,datanode和程式碼都在一台機器上處理,避免了網路傳輸.
我們的代碼拿到tasktracker上去執行,我們的tasktracker執行的資料來源於datanode,我們的程式就把各個datanode上的資料給處理了.
reduce匯總的是這種map的輸出,map處理的資料來自於datanode,但是map程式處理後的結果不一定放在datanode中,可以放到linux磁碟.reduce處理的資料來自於各個資料處理節點的linux磁碟.reduce處理完之後的輸出放到datanode上.
如果有節點空閑,reduce節點就在空閑節點上運行,如果都跑程式,就隨機一個節點跑reduce
tasktracker處理的任務都是來自於datanode,處理資料是並行的.map處理完之後結果放到linux磁碟上.reduce程式的處理,是把map處理後linux磁碟上的資料都匯總到reduce節點處理,reduce處理完之後,將結果輸出到datanode上.
  我們的資料是放在hdfs中,hdfs決定把資料是放在哪個datanode上的,決定的權利不在於我們的處理,而是在於hdfs.到底放在哪個datanode上不需要我們去關心.
  datanode有副本,資料在進行儲存的時候,是把資料放到多個datanode上.
  平行處理資料,把我們處理問題的應用程式放到各個存放資料的節點上進行處理,處理完之後獲得的是每一個本地的資料,通過redcue把各個本地的資料進行匯總起來,就得到一個最終的結果.reduce可以有多個.
  原來集中式的資料處理方式,缺點是海量資料移動到一個資料處理節點上,程式啟動並執行大量時間消耗在網路傳輸上.串列,效能不好.
  把計算程式放到儲存資料的各個節點上並存執行.map程式計算本地節點的資料,並行結束後,會有很多的中間結果,reduce程式是把Map程式啟動並執行中間結果匯總到一起,作為最終結果.
原來的這種處理資料的方式,是把應用程式放到一個地方,然後海量的資料不斷的往這個應用上挪,它的大量時間消耗在網路傳輸上還有磁碟的io上.程式處理起來並不複雜,因為資料量太大,所以把時間都耗費到這上面了.

  我們改進行一下計算方法,把我們的小程式放到各個的資料節點上,map程式就去處理原生資料,每一個map程式都去處理原生資料,處理完之後,會得到多個中間結果.
map處理本地操作可以節省網路傳輸,在本地就可以把資料處理了.map程式適合於計算的本地化.我們的Reduce程式不能實現計算的本地化,因為是匯總map的輸出,map的輸出必然會分布在很多的機器上.
  我們的map是放在各個tasktracker上去執行的,就是把各個tasktracker的本機資料給處理掉,處理後會得到一個中間結果,reduce程式就會各個map處理的結果給匯總起來,mapreduce在這裡就是這麼一個過程,map是處理各個節點的.reduce是匯總map輸出的.
  MapReduce是一個分散式運算模型,主要是用來處理海量資料的.

  MapReduce原理:

        
  MapReduce計算模型包括Map和Reduce兩個階段,我們使用者只需要處理map階段和reduce階段就行了.

    1) map用來處理本機資料,在處理本地的資料時,需要想我的資料存放在原生什麼位置,我要進行什麼樣的計算,計算結果我要放在原生什麼位置.這些東西都是由mapreduce架構給我們實現的,資料在哪,我們只需要知道hdfs就行了,資料處理之後的中間結果放在哪,這個也是mapreduce架構給我們做的,我們自己不需要管.

    2) reduce是把map輸出的結果給匯總到一起,map輸出的結果在哪,怎樣傳輸到reduce中,我們開發人員也不需要管,我們只需要管資料匯總這一件事就可以了,處理之後的結果,只需要再寫進hdfs中就可以了,別的就不需要管了.

  所以我們實現一個分散式運算還是比較簡單的,這裡邊我們關心的是我們map處理的資料來自於hdfs,處理之後又會寫出到中間結果,reduce程式又會把我們的中間結果的資料拿過來進行處理.處理完成之後又會把結果寫出到hdfs中,在處理的過程中是在不斷的傳輸資料,資料轉送的的方式是採用索引值(key,value)對的形式.索引值對也就是我們兩個函數的形參,輸入參數.
MapReduce執行流程:

  Mapper任務處理的資料位元於各個程式上的,處理完之後,會產生一個中間的輸出,Reduce就是專門處理Mapper產生的中間輸出的.reduce處理完之後,就會把結果作為一個中間結果輸出出來.Map任務和Reduce任務到底在那個TaskTracker上去執行,什麼樣的tasktracker執行map任務,什麼樣的taskTracker去執行Reduce任務,這個事不需要我們去關心,是架構中的JobTracker管理的.Jobtracker它裡邊的這個程式來自於客戶的提交.客戶把我們的程式提交給Jobtracker之後,使用者就不需要參與了,JobTracker就會自動把我們的程式分配到TaskTracker上去執行,有的tasktracker上跑map,有的taskTracker上跑reduce.Map程式讀資料來自於hdfs,我們只需要告訴是哪個檔案的路徑就可以了,別的不需要我們去管.MapReduce就會把我們的程式自動的運行,把原始的資料處理完產生中間資料,然後在處理,最終就會產生一個最終的結果,使用者看到的其實是最後的reduce輸出結果.
map任務處理完之後產生的資料位元於我們各個節點本地的,也就是我們linux磁碟,而不是位於hdfs中.會起多個reduce任務,每個reduce任務會取每個map任務對應的資料,這樣reduce就會把各個map任務的需要的資料給拿到.
  map和reduce之間資料分發的過程稱作shuffle過程,shuffle在細節中:map資料產生之後需要進行分區,每個reduce處理的資料就是不同map分區下的資料.reduce就會把所有map分區中的資料處理完之後寫出到磁碟中.
  按官方的源碼步驟講會把shuffle歸結為reduce階段,map到reduce資料分發的過程叫做shuffle.
  shuffle是把我們map中的資料分發到reduce中去的一個過程.
  reduce執行完之後就直接結束了,直接寫出去.不會經過Jobtracker,但是會通知Jobtracker運行結束.
  有幾個reduce就有幾個shuffle分發的過程.
  map它只做原生處理,處理完之後,是由reduce做匯總的.會讀取所有map中相同分區中的資料,所以shuffle可以認為是reduce的一部分,因為map執行完之後就已經結束了.
  匯總節點是主動去其他節點要資料.reduce這個節點其實是知道各個map的,一些map執行完之後,會把資料寫到本地linux磁碟,那麼我們的reduce就會通過http的協議把map端處理後的資料要過來.
  JobTracker是管理者,TaskTracker是幹活的,TaskTracker分map任務和reduce任務,那麼map任務運行完成之後,會告訴JobTracker我寫完了,JobTracker一看map寫完之後,就會在一個TaskTracker起一個Reduce任務,把他們這些執行完畢之後的map任務的地址告訴reduce,reduce就會通過http協議去map那讀取資料.理解這些東西需要有JobTracker做管理,只要是出現他們之間做協調的時候,全部都是JobTracker做協調,管理的.哪個機器承擔reduce任務也是JobTracaker在接到任務之後分配好了的.因為TasktTracker只是工作者,本身沒有思考能力的,只有JobTracker有思考能力.
  JobTracker分配的原理:在儲存資料的節點上起map任務,jobTracker怎麼會知道哪些節點存放資料呢 這個需要問namenode,namenode會知道哪些Datanode會存放資料.
  要處理的檔案被劃分為多少個block就會有多少個map.JobTracker 沒有儲存任何東西,只是一個管理角色.
  map在輸出的時候會確定分成多少個區對應的就會有多少個reduce任務,資料分發的時候就會由shuffle的這個過程進行分發.所以說按道理來講的話,reduce分區的數量應該有map分區的數量來決定的.
  map的個數由inputSplit的個數決定的.因為inputSplit的大小預設和block的大小一樣的.
  hadoop的一個特點就是高容錯性,JobTracker會監控各個節點的map任務和reduce任務的執行情況,如果有一個map任務宕了,會啟用一個重啟機制,會再重啟一個mapper任務去執行.如果連續宕個三次左右,就不會重啟了.那麼這個程式的整個運行就失敗了.會有一定的容錯性在裡邊的,這個容錯性是由JobTracker來進行控制的.
  map處理其他節點的block,我們使用者是沒法控制的.

    有datanode的節點 殺死Tasktracker,我們的程式在啟動並執行時候只能使用其他節點的block了.我們的處理的未經處理資料,不允許被很多的map任務處理,只允許被一個處理,我們的資料是分配到多個dataNode上的,那麼這一個map勢必要讀取其他節點的block.

MapReduce的執行過程:

  1.map任務處理:
    1.1 讀取hdfs檔案為內容,把內容中的每一行解析成一個個的鍵(key)值(value)對.檔案總是有行的,每一個索引值對調用一次map函數.map函數處理輸入的每一行,
    1.2 寫自己的邏輯,對輸入的key,value(把每一行解析出的key,value)處理,轉換成新的key,value輸出.
    1.3 對輸出的key,value進行分區.根據業務要求,把map輸出的資料分成多個區..
    1.4 對不同分區上的資料,按照key進行排序,分組.相同key的value放到一個集合中.
    1.5 是把分組後的資料進行歸約.
      shuffle:把我們map中的資料分發到reduce中去的一個過程,分組還是在map這邊的.
  2.reduce任務處理:
    2.1 每個reduce會接收各個map中相同分區中的資料.對多個map任務的輸出,按照不同的分區通過網路copy到不同reduce節點.shuffle實際指的就是這個過程.
    2.2 對多個map任務的輸出進行合并,排序.寫reduce函數自己的邏輯,對輸入的key,value處理,轉換成新的key,value輸出.
    2.3 把reduce的輸出儲存到新的檔案中.

MapReduce概述,原理,執行過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.