MapReduce適合PB級以上海量數據的離線處理MapReduce不擅長什麼
實時計算
像MySQL一樣,在毫秒級或者秒級內返回結果
流式計算
MapReduce的輸入數據集是靜態的,不能動態變化
MapReduce自身的設計特點決定了數據源必須是靜態的
DAG計算
多個應用程序存在依賴關係,後一個應用程序的輸入為前一個的輸出
MapReduce編程模型
MapReduce將作業job的整個運行過程分為兩個階段:Map階段和Reduce階段
Map階段由一定數量的Map Task組成
輸入數據格式解析:InputFormat
輸入數據處理:Mapper
數據分組:Partitioner
Reduce階段由一定數量的Reduce Task組成
數據遠程拷貝
數據按照key排序
數據處理:Reducer
數據輸出格式:OutputFormat
InputFormat
文件分片(InputSplit)方法
處理跨行問題
將分片數據解析成key/value對
默認實現是TextInputFormat
TextInputFormat
Key是行在文件中的偏移量,value是行內容
若行被截斷,則讀取下一個block的前幾個字符
Split與Block
Block
HDFS中最小的數據存儲單位
默認是64MB
Spit
MapReduce中最小的計算單元
默認與Block一一對應
Block與Split
Split與Block是對應關係是任意的,可由用戶控制
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處理
Map和Reduce兩階段
Map階段
InputFormat(默認TextInputFormat)
Mapper
Combiner(local reducer)
Partitioner
Reduce階段
Reducer
OutputFormat(默認TextOutputFormat)
MapReduce編程模型—內部邏輯
MapReduce編程模型—外部物理結構
MapReduce 2.0架構
Client
與MapReduce 1.0的Client類似,用戶通過Client與YARN交互,提交MapReduce作業,查詢作業運行狀態,管理作業等。
MRAppMaster
功能類似於 1.0中的JobTracker,但不負責資源管理;
功能包括:任務劃分、資源申請並將之二次分配個Map Task和Reduce Task、任務狀態監控和容錯。
MapReduce 2.0容錯性
MRAppMaster容錯性
一旦運行失敗,由YARN的ResourceManager負責重新啟動,最多重啟次數可由用戶設置,默認是2次。一旦超過最高重啟次數,則作業運行失敗。
Map Task/Reduce Task
Task週期性向MRAppMaster彙報心跳;
一旦Task掛掉,則MRAppMaster將為之重新申請資源,並運行之。最多重新運行次數可由用戶設置,默認4次。
數據本地性
什麼是數據本地性(data locality)
如果任務運行在它將處理的數據所在的節點,則稱該任務具有“數據本地性”
本地性可避免跨節點或機架數據傳輸,提高運行效率
數據本地性分類
同節點(node-local)
同機架(rack-local)
其他(off-switch)
推測執行機制
作業完成時間取決於最慢的任務完成時間
一個作業由若干個Map任務和Reduce任務構成
因硬件老化、軟件Bug等,某些任務可能運行非常慢
推測執行機制
發現拖後腿的任務,比如某個任務運行速度遠慢於任務平均速度
為拖後腿任務啟動一個備份任務,同時運行
誰先運行完,則採用誰的結果
不能啟用推測執行機制
任務間存在嚴重的負載傾斜
特殊任務,比如任務向數據庫中寫數據
常見MapReduce應用場景
簡單的數據統計,比如網站pv、uv統計
搜索引擎建索引 (mapreduce產生的原因)
海量數據查找
複雜數據分析算法實現
聚類算法
分類算法
推薦算法
圖算法
閱讀更多 訊宜捷科技 的文章