分布式計算:
原則:移動計算而盡可能減少移動數據(減少網絡開銷)
分布式計算其實就是將單台機器上的計算拓展到多台機器上並行計算。
MapReduce是一種編程模型。Hadoop MapReduce采用Master/slave 結構。只要按照其編程規范,只需要編寫少量的業務邏輯代碼即可實現一個強大的海量數據並發處理程序。核心思想是:分而治之。Mapper負責分,把一個復雜的業務,任務分成若干個簡單的任務分發到網絡上的每個節點並行執行,最后把Map階段的結果由Reduce進行匯總,輸出到HDFS中,大大縮短了數據處理的時間開銷。MapReduce就是以這樣一種可靠且容錯的方式進行大規模集群海量數據進行數據處理,數據挖掘,機器學習等方面的操作。
MapReduce分布式計算框架體系結構
首先理解幾個概念:
Master:是整個集群的唯一的全局管理者,功能包括:作業管理、狀態監控和任務調度等,即MapReduce中的JobTracker
slave:負責任務的執行和任務狀態回報,即MapReduce中的TaskTracker
Job&Task:在hadoop mapreduce中,一個 Job 它是一個任務,主業務。一個Job 可以拆分成多個Task,map Task與reduce Task。
JobTracker:JobTracker是一個后台服務進程,啟動之后,會一直監聽並接收來自各個TaskTracker發送的心跳信息,包括資源使用情況和任務運行情況等信息
JobTracker的主要功能:
作業控制:在hadoop中每個應用程序被表示成一個作業,每個作業又被分成多個任務,JobTracker的作業控制模塊則負責作業的分解和狀態監控。
最重要的狀態監控:主要包括TaskTracker狀態監控、作業監控和任務狀態監控。主要作用:容錯和為任務調度提供決策依據。
資源管理。
TaskTracker:TaskTracker是JobTracker和Task之間的橋梁:一方面,從JobTracker接收並執行各種命令:運行任務、殺死任務等;另一方面講本地節點上各個任務狀態通過心跳周期性匯報給JobTracker。TaskTracker與JobTracker和Task之間采用了RPC協議進行通信。
TaskTracker的功能:
匯報心跳:Tracker周期性講所有節點上各種信息通過心跳機制匯報給JobTracker。這些信息包括兩部分:
*機器級別信息:節點健康情況,資源使用情況等。
*任務級別信息:任務執行進度、任務運行狀態等。
執行命令:JobTracker會給TaskTracker下達各種命令,主要包括:啟動任務(LaunchTaskAction)、提交任務(CommunitTaskAction),殺死任務(KillJobAction)和重新初始化(TaskTrackerReinitAction)。
MapReduce體系結構里有兩類節點,第一個是JobTracker,它是一個master管理節點,另一個是TaskTracker。客戶端(Client)提交一個任務(Job),JobTracker把他提交到候選列隊里,將Job拆分成map任務(Task)和reduce任務(Task),把map任務和reduce任務分給TaskTracker執行。在mapreduce編程模型里,Task一般起在和DataNode所在的同一台物理機上。如下圖(圖片來自網絡):

MapReduce分布式工作流程
1.分布式的運算程序往往需要分成至少2個階段
MapReduce的第一階段是Map,運行的實例叫Map Task,第二階段是Reduce,運行的實例叫Reduce Task。每個Task只需要完成后把文件輸出到自己的工作目錄即可。
2.第一階段的Task並發實例各司其職,各自為政,互不相干,完全並行
3.第二階段的Task並發實例互不相干,但是他們的數據以來於上一階段的所有Task並發實例的輸出
4.MapReduce編程模型,只能包含一個Map階段和一個Reduce階段,如果用戶的業務邏輯非常復雜,那就只能來多個mapreduce程序,串行運行
MapReduce容錯機制
MapReduce的第一階段是Map,運行的實例叫Map Task,第二階段是Reduce,運行的實例叫Reduce Task。第二階段Reduce要等第一階段Map上的Map Task完成之后才能開始。如果Map Task運行失敗,如何處理?
這時候就要啟動mapreduce的容錯機制了,它允許整個執行過程中TaskTracker中間出現宕機,發生故障,JVM發生重啟等等這些情況,允許它出錯。處理的方式:
1.重復執行
有可能是job本身問題,硬件問題,數據的問題都有可能,默認會重新執行,如果重新執行4次都失敗就放棄執行。
2.推測執行
由於要Map端所有任務執行完才會執行reduce任務,可能存在某個節點完成的特別慢,JobTracker發現它很慢的時候,說明它出現了問題,另外找一台TaskTrack執行同一任務,哪個先完成就取該結果,結束另一個TaskTracker。
總結
以上知識體系基本能解決一下幾個問題了:
1.你的MapTask如何進行任務分配?
3.MapTask和ReduceTask之間如何銜接?
4.如果某MapTask運行失敗,如何處理?
master監控到有MapTask失敗就會啟動在另一台機器上啟動maptask,主要由MapReduce容錯機制處理。詳情看上面的MapReduce容錯機制。
5.mapreduce如果都需要自己自己負責輸出的分區,很麻煩,所以有一個master管理,MapTask只需要把文件輸出到自己的工作目錄即可,ReduceTask執行時由master中的管理節點JobTracker把MapTask的資源調動給ReduceTask,發揮資源管理作用。
MapReduce運行的兩種模式
MapReduce運行模式分為兩種,本地模式和運行在yarn上
拓展:MapReduce的輸出目錄原則上是不能存在的,已經存在的話會報錯。