說明: 經過由普通機器組成的集羣對大量數據集進行並行處理可依靠的容錯軟件框架。html
MapReduce做業能夠將數據集分割爲Map任務並行處理的數據塊,框架對對Map過程產生的數據進行排序,而後最爲reduce任務的數據輸入,一般做業的的輸出和輸入數據保存在一個文件系統(Spark一般保存在內存),框架主要關注點在任務調度,任務監控,執行失敗任務。node
一般計算節點和存儲節點是相同的,也就是Mapreduce框架和HDFS在同一組DataNode運行,這種配置能夠容許框架在集羣高效調度任務,從而避免由於節點之間的數據傳輸形成寬帶的浪費以及效率的下降算法
數據靠近原則:運行任務以及執行任務須要的數據最好在同一臺機器,這樣任務執行過程當中涉及到的數據能夠提供相似本地訪問的方式處理,從而提升效率apache
MapReduce框架有一個主ResourceManager,集羣節點的NodeManager以及每一個應用匹配的MRAppMaster組成,也就是一個MapReduce只有一個ResourceManager,可是能夠有許多個NodeManger,而且一個做業只對應一個MRAppMaster(hadoop 2.x使用YARN做爲資源管理器)網絡
最低限度應用須要經過抽象類的實現來指定map和reduce的input/output位置,並結合其餘的做業參數構成MapReduce任務的配置,Hadoop做業客戶端而後提交做業和配置信息給ResourceManager,ResourceManger接收Worker的響應信息,而且調度任務、監控任務、返回做業狀態信息給做業客戶端,儘管Hadoop框架是由Java實現,MapReduce做業能夠不使用Java編寫,Hadoop Streaming容許用戶使用做爲Mapper和Reducer的可執行文件來建立和運行做業,hadoop Pipes是一個兼容C++ API實現的mapReduce應用(非基於JNI)app
MapReduce框架只操做pairs,框架將一組key-value的pair做爲做業的輸入和輸出,輸入、輸入能夠是不一樣的類型,key和value必須能支持經過網絡傳輸,所以必須序列化,實現Writable接口,爲了方便排序則實現WritableComparable接口負載均衡
(input) (k1, v1) --> map -->( k2, v2) --> combine --> (k2, v2) --> reduce --> (k3, v3) (output)
將框架分割輸入數據映射爲一組中間key-value對,Map只是將輸入記錄轉換爲一箇中間記錄,轉換以後的數據類型不要求和輸入類型相同,Hadoop MapReduce爲每一個由做業的InputFormat生成的InputSplit產生對應的Map任務,總之mapper能夠經過做業的Job.setMapperClass(Class)傳遞給做業,框架而後調用處理任務InputSlipt內部的key-value的map(WritableComparable, Writable, Context)方法,應用能夠重寫cleanup(Context)方法來執行清理任務。output對不要求和input對的類型一直,output對只要經過context.warite(WritableComparable, Writable)收集,應用一樣可使用Counter來報告它的統計信息。注意全部的中間結果隨後都會被框架排序分組,而且傳遞給Reducer來就決定最終結果,用戶可經過Job.setGroupingComparatorClass(Class)方法來指定Comparator來控制分組過程,Mapper輸出數據被排序,而後分區給每一個Reducer,分區的總數量與做業的reduce做業的數量一致,用戶能夠在Reducer實現Partitioner接口開控制分區中包含的key,注意Mapper會將Ouput對放在某個位置,Reducer會從對應的位置主動抓取數據。用戶可選擇的經過 Job.setCombinerClass(Class)來指定一個combiner去執行中間結果的本地聚合,這樣有利於減小從Mapper到Reducer的傳輸數據。中間排序的output老是保存爲一個簡單的(key-len, key, value-len, value)格式。應用能夠經過Configuration控制Output是否壓縮、如何壓縮。框架
Maps的數量是根據input的總大小,也就是輸入數據文件的總的數據塊數決定,推薦並行執行map過程大約是10-100/單節點,例如輸入數據爲10T,數據塊大小128M,map做業數=1010241024/128 = 81920 個,實際Map做業可能出現失敗,也就是最小的,map做業數量是81920,可是可使用Configuration.set(MRJobConfig.NUM_MAPS, int) 方法設置map的數量函數
經過相同的key聚合中間結果(key-valueList),reducer的數量能夠經過Job.setNumReduceTasks(int)設置,總之Reducer能夠經過Job.setReducerClass(Class)方法傳遞給做業,在Map分組的key-valueList調用 reduce(WritableComparable, Iterable<Writable>, Context),應用能夠經過重寫cleanup(Context)方法執行清理任務工具
shuffle: 導入Reducer的是Mappers已排序的輸出結果,shuffle主要經過HTTP方式住區全部的Mapper輸出的數據分區
sort: 框架主要根據key對Reducer進行分組,shuffle和sort是同時進行的,Mapper輸出會被抓取合併
Secondary Sort: 若是想要對中間記錄實現與在reduce之間的key分組方式不一樣,可經過Job.setSortComparatorClass(Class) 來設置一個Comparator。Job.setGroupingComparatorClass(Class)用於控制中間記錄的分組方式,這些能用來進行值的二次排序。
reduce: 這個階段reduce(WritableComparable, Iterable<Writable>, Context)方法被調用,reduce任務結果會經過Context.write(WritableComparable, Writable)寫入文件系統,應用能夠Counter報告reduce任務的統計信息,Reducer的輸出數據是不會排序的
推薦的數量是node節點數與0.95或1.75的積,0.95d的時候當map完成以後,全部的reduce任務會當即運行並傳輸map的輸出數據,1.75更快的節點會首先完成第一輪的reduce任務,接着發動第二輪的reducer任務,可以起到更好的做業執行的負載均衡的效果。圖稿reduce的數量會提升框架的消耗,可是會提升負載均衡和較低失敗的機率,縮放因子的reduce數會少於所有的全部redcue任務,由於存在部分reduce處理特殊任務和失敗任務
經過設置reducer數量爲0,MapReduce只會執行Map過程,而且經過 FileOutputFormat.setOutputPath(Job, Path).方法設置Map的輸出數據保存路徑,在保存在文件系統以前,map的輸出數據不會進行排序
partioner主要劃分key的空間,控制map輸出數據的key分區過程,key通常是經過hash函數產生,傳給partioner用於構建分區,分區的數量與reduce任務數量相同,默認的分區器:HashPartitioner,hash算法計算ke
Counter是MapReduce應用報告統計信息的工具
過程:
表示一個獨立的Mapper處理的數據,FileSplit是默認的InputSplit,可經過設置 mapreduce.map.input.file設置邏輯切分的輸入文件路徑
從InputSplit讀取key-value鍵值對,用於Map過程處理
過程:
描述一個MapReduce做業的任務提交
FileOutputCommitter 是默認的OutputCommitter
將輸出key-value鍵值對寫入輸出文件