MapReduce概述,原理,執行過程

MapReduce概述

  MapReduce是一種分佈式計算模型,運行時不會在一臺機器上運行.hadoop是分佈式的,它是運行在不少的TaskTracker之上的.
  在咱們的TaskTracker上面跑的是Map或者是Reduce Task任務.
  一般咱們在部署hadoop taskTracker 的時候,咱們的TaskTracker同時仍是咱們的Datanode節點.datanode和tasktracker老是部署在一塊兒的.node

  MapReduce執行流程:linux

        

  爲何要有多個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磁盤上.r educe程序的處理,是把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階段就好了.app

    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 自定義map函數,寫本身的邏輯,對輸入的key,value(把每一行解析出的key,value)處理,轉換成新的key,value輸出.
    1.3 對輸出的key,value進行分區.根據業務要求,把map輸出的數據分紅多個區..
    1.4 對不一樣分區上的數據,按照key進行排序,分組.相同key的value放到一個集合中.
    1.5 把分組後的數據進行歸約.
  2.reduce任務處理:

      shuffle:把咱們map中的數據分發到reduce中去的一個過程,分組仍是在map這邊的.
    2.1 每一個reduce會接收各個map中相同分區中的數據.對多個map任務的輸出,按照不一樣的分區經過網絡copy到不一樣reduce節點.shuffle實際指的就是這個過程.
    2.2 對多個map任務的輸出進行合併,排序.寫reduce函數本身的邏輯,對輸入的key,value處理,轉換成新的key,value輸出.
    2.3 把reduce的輸出保存到新的文件中.

    TaskTracker節點上若是跑的是map任務,咱們的map任務執行完以後,就會告訴咱們的JobTracker執行完畢,把這個數據讓咱們的reduce來讀取.讀取的時機是一個map執行完畢以後讓reduce去處理獲取數據.
    JobTracker只作管理和通知,數據只在map和reduce之間流動,準確的說,只會在TaskTracker之間流動.
    排序是框架內置的.默認就有.分組不是減小網絡開銷,分組不是合併,只是把相同的key的value放到一塊兒,並不會減小數據.
    分組是給了同一個map中相同key的value見面的機會.做用是爲了在reduce中進行處理.
    map函數僅能處理一行,兩行中出現的這個單詞是沒法在一個map中處理的.map不能處理位於多行中的相同的單詞.分組是爲了兩行中的相同的key的value合併到一塊兒.
    在自定義MyMapper類內部定義HashMap處理的是一個block,在map方法內部定義處理的是一行.
    在hadoop全局中不會有線程問題,由於hadoop起的是進程,不會有併發問題存在.

  爲何hadoop不使用線程?     線程實際指的是在集中式開發下,經過線程,可讓咱們的併發量,處理的吞吐量上升,線程會帶來一個數據競爭的問題.hadoop中MapReduce是經過分佈式多進程來實現高吞吐量,在裏邊不會經過線程來解決問題,由於它裏邊已經有不少的服務器,不少的線程了,沒有必要使用線程.

相關文章
相關標籤/搜索