mapreduce學習-設計思想和原理
MapReduce設計思想及原理
mapreduce:一是軟體框架,二是並行處理,三是可靠且容錯,四是大規模叢集,五是海量資料集
參考
參考:https://www.cnblogs.com/riordon/p/4605022.html
設計思想:分而治之,
mapper 負責分,分,將任務分為多個簡單任務,簡單任務就是1、相對於原任務要大大縮小,2、就近原則,相比移動資料,移動計算成本要低,計算會在資料就近的節點計算,3、任務可以並行。
Reducer負責對map階段的結果進行彙總,至於需要多少個Reducer,使用者可以根據具體問題,通過在mapred-site.xml配置檔案裡設定引數mapred.reduce.tasks的值,預設值為1
mapreduce工作流程:
1、打包程式,執行,
2、向jobtracker獲取一個job id
3、JobClient得到Job ID後,將執行Job所需要的資源拷貝到共享檔案系統HDFS中
4、資源準備完備後,JobClient向JobTracker提交Job。
5、jobtracker初始化job
6、初始化完成後,JobTracker從HDFS中獲取輸入splits(作業可以該啟動多少Mapper任務)。
7、與此同時,TaskTracker不斷地向JobTracker彙報心跳資訊,並且返回要執行的任務
8、TaskTracker得到JobTracker分配(儘量滿足資料本地化)的任務後,向HDFS獲取Job資源(若資料是本地的,不需拷貝資料)。
9、獲取資源後,TaskTracker會開啟JVM子程序執行任務。
mapreduce框架組成:jobtracker、tasktracker
JobTracker負責排程構成一個作業的所有任務,這些任務分佈在不同的TaskTracker上(由上圖的JobTracker可以看到2 assign map 和 3 assign reduce)。你可以將其理解為公司的專案經理,專案經理接受專案需求,並劃分具體的任務給下面的開發工程師。
TaskTracker負責執行由JobTracker指派的任務,這裡我們就可以將其理解為開發工程師,完成專案經理安排的開發任務即可。
mapreduce的原理:
map task
程式會根據InputFormat將輸入檔案分割成splits,每個split會作為一個map task的輸入,每個map task會有一個記憶體緩衝區,
輸入資料經過map階段處理後的中間結果會寫入記憶體緩衝區,並且決定資料寫入到哪個partitioner,當寫入的資料到達記憶體緩衝
區的的閥值(預設是0.8),會啟動一個執行緒將記憶體中的資料溢寫入磁碟,同時不影響map中間結果繼續寫入緩衝區。在溢寫過程中,
MapReduce框架會對key進行排序,如果中間結果比較大,會形成多個溢寫檔案,最後的緩衝區資料也會全部溢寫入磁碟形成一個溢寫
檔案(最少有一個溢寫檔案),如果是多個溢寫檔案,則最後合併所有的溢寫檔案為一個檔案。
reduce task
當所有的map task完成後,每個map task會形成一個最終檔案,並且該檔案按區劃分。reduce任務啟動之前,一個map task完成後,
就會啟動執行緒來拉取map結果資料到相應的reduce task,不斷地合併資料,為reduce的資料輸入做準備,當所有的map tesk完成後,
資料也拉取合併完畢後,reduce task 啟動,最終將輸出輸出結果存入HDFS上。