Mapreduce原理和YARN
MapReduce定義
MapReduce是一種分布式計算框架,由Google公司2004年首次提出,并貢獻給Apache基金會。
MR版本
- MapReduce 1.0,Hadoop早期版本(只支持MR模型)
- MapReduce 2.0,Hadoop 2.X版本(引入了YARN資源調度框架后,除了支持MR,還支持其他計算模型
MR V1 執行流程
MR v2 vs MR v1 流程
MR v2運行機制的改進,啟動了YARN
MR V2 執行流程
Resource Container, 資源容器
1)是集群節點將自身內存、CPU、磁盤等資源封裝在一
起的抽象概念;
2)調度器根據應用的資源需求和集群各個節點的資源容
器進行調度;
3)RM的應用管理器負責接收作業,協商獲取第一個資源
容器用于執行應用的任務主體并為重啟失敗的應用主體分
配容器;
4)DN節點的應用主體負責通過協商從調度器獲取資源容
器,并跟蹤這些容器的狀態和應用執行的情況
Mapper任務流程
① 讀取輸入文件,解析成key、value對。對輸入文件的每
一行(k1,v1),解析成多個key、value對(k2,v2)。每
個(k1、v1)鍵值對調用一次map函數;
② 寫代碼邏輯將輸入的k1、v1處理成新的k2、v2輸出;
③ 對輸出的k2、v2進行分區(如果不指定默認1個分區,
分區號為0);
④ 對不同分區的數據,按照k2進行排序、分組。相同k2的
v2放到集合v2’
={v21
,v22
,v23
,…v2n}中;
⑤ (可選)分組后的數據進行歸約(combiner);
⑥ Mapper的結果寫入本地磁盤
Reducer任務流程
① 對多個map任務的輸出,按照不同的分區,通過網絡
復制到不同的reduce節點(取map端的結果數據);
② 一個Reduce任務處理一個分區數據;
③ 對屬于當前分區的多個map任務的輸出結果進行合并
、排序。寫reduce函數的代碼,對輸入的k2,v2’處理
,轉換成新的k3、v3輸出;
④ 把reduce的輸出保存到文件中。文件名為 part-r- 0000N
MapReduce核心概念
- 不同的Map任務之間不會進行通信
- 不同的Reduce任務之間也不會發生任何信息交換
- 用戶不能顯式地從一臺機器向另一臺機器發送消息
- 所有的數據交換都是通過MapReduce框架自身去實現的
文件輸入格式InputFormat
定義了數據文件如何分割和讀取。InputFile提供了以下一些功能
- 選擇文件或者其它對象,用來作為輸入
- 定義InputSplits, 將一個文件分為不同任務
- 為RecordReader提供一個工廠,用來讀取這個文件
例如:有一個抽象的類FileInputFormat,
FileInputFormat從這個目錄中讀取
所有文件,然后FileInputFormat將
這些文件分割為多個InputSplits。
輸入數據分塊InputSplits
InputSplit定義了輸入到單個Map任務的輸入數據
- 一個MapReduce程序被統稱為一個Job,可能有上百個任務構成
- InputSplit將文件分為128MB的大小
數據記錄讀入RecordReader
InputSplit定義了一個數據分塊,但是沒有定義如何讀取數據記錄。RecordReader實際上定義了如何將數據記錄轉化為一個(key,value)對的詳細方法,并將數據記錄傳給Mapper類。
例如:TextInputFormat提供了
LineRecordReader,讀入一個文
本行數據記錄
Mapper
每一個Mapper類的實例生成了一
個Java進程,負責處理某一個
InputSplit上的數據
- V1中,有兩個額外參數OutputCollector以及Reporter,前者收集中間結果,后者獲得環境參數以及設當前執行的狀態。
- 現在的版本V2用Context提供給每一個Mapper函數,用來提供上面兩個對象的功能
Combiner
對Map端的輸出進行合并,即合并相同key的鍵值對,以便
減少partitioner數據通信開銷。
可以不用指定;如果指定合并類,其性質類似于本地執行
的一個Reducer,滿足一定的條件才能夠執行
Partitioner & Shuffle&Sort
-
Partitioner & Shuffle
在Map工作完成之后,每一個 Map函數的結果會被傳輸到對
應Reducer所在的節點,此時用戶可以提供一個Partitioner
類,用來決定一個給定的(key,value)對傳給哪個節點。 -
Sort
傳輸到每一個Reducer節點上的、將被所有的Reduce函數接
收到的Key,value對會被Hadoop自動排序(即Map生成的結
果傳送到某一個節點的時候,會被自動排序)
Shuffle
Shuffle過程就是從map端輸出到reduce端輸入之間的過程;是Hadoop中最核心的部分!!!
Shuffle的Map端
Shuffle的Reduce端
Reducer
做用戶定義的Reduce操作。
編程接口是Context。
一個分區對應一個Reducer。
每個分區對應一個輸出文件 part-r-0000X。
文件輸出格式OutputFormat
寫入到HDFS的所有OutputFormat
都繼承自FileOutputFormat
。 每一個Reducer都寫一個文件到一
個共同的輸出目錄,文件名是part- nnnnn,其中nnnnn是與每一個
reducer相關的一個號(partition id)
MapReduce-任務執行總結
推測式執行(speculative) –如果某個節點的任務執行過慢,會啟動備份任務
YARN定義
YARN 是Hadoop 2.0 中的資源管理系統
,它是一個通用的資源管理模塊,可為
各類應用程序進行資源管理和調度。
YARN三大組件
- 啟動/監控ApplicationMaster
- 監控NodeManager
- 資源分配與調度
- 處理來自ResourceManager的命令
- 處理來自ApplicationMaster的命令
- 數據切分
- 為應用程序申請資源,并分配給內部任務
- 任務監控與容錯
YARN資源調度器
- FIFO,先進先出調度器
- Fair Scheduler,公平調度器
- Capacity Scheduler,容量調度器
總結
以上是生活随笔為你收集整理的Mapreduce原理和YARN的全部內容,希望文章能夠幫你解決所遇到的問題。