MapReduce特色
易於編程(熟悉以後確實很簡單,大多數是map和reduce兩個部分。hive和pig讓mapreduce更加簡單)
良好的擴展性(簡單的添加機器就能夠實現)
高容錯性(job中任務部分失敗,能夠從新執行)
適合PB級以上海量數據的離線處理
MapReduce不擅長
實時計算
像MySQL同樣,在毫秒級或者秒級內返回結果(能夠參考Spark或HBase,HBase隨機讀寫性能好,統計不太好)
流式計算
MapReduce的輸入數據集是靜態的,不能動態變化
MapReduce自身的設計特色決定了數據源必須是靜態的(能夠考慮Storm)
DAG計算
多個應用程序存在依賴關係,後一個應用程序的輸入爲前一個的輸出(Tez)
MapReduce將做業的整個運行過程分爲兩個階段
Map階段和Reduce階段
Map階段由必定數量的Map Task組成
輸入數據格式解析:InputFormat
輸入數據處理:Mapper
數據分組:Partitioner
Reduce階段由必定數量的Reduce Task組成
數據遠程拷貝
數據按照key排序
數據處理:Reducer
數據輸出格式:OutputFormat編程
默認TextInputFormat對文件切分,並處理每個Split,提供RecordReader生成key/value
TextInputFormat:Key是行在文件中的偏移量,value是行內容若行被截斷,則讀取下一個block的前幾個字符
設計到的概念
Block
HDFS中最小的數據存儲單位默認是64MB
Spit
MapReduce中最小的計算單元默認與Block一一對應
Block與Split
Split與Block是對應關係是任意的,可由用戶控制網絡
Map階段
InputFormat(默認TextInputFormat)
Mapper
Partitioner
Sort(可選)
Combiner(local reducer)(可選)app
Reduce階段
Sort
Reducer
OutputFormat(默認TextOutputFormat)性能
Combiner
Combiner可作看local reducer合併相同的key對應的value(wordcount例子)一般與Reducer邏輯同樣好處
減小Map Task輸出數據量(磁盤IO)
減小Reduce-Map網絡傳輸數據量(網絡IO)
結果可疊加
Sum(YES!),Average(NO!)
Partitioner
Partitioner決定了Map Task輸出的每條數據交給哪一個Reduce Task處理默認實現:hash(key) mod R R是Reduce Task數目
容許用戶自定義,不少狀況需自定義Partitioner
好比「hash(hostname(URL)) mod R」確保相同域名的網頁交給同一個Reduce Task處理設計