MapReduce定義
MapReduce是一種分布式計算框架,由Google公司2004年首次提出,并貢獻給Apache基金會。
MR版本
- MapReduce 1.0,Hadoop早期版本(只支持MR模型)
- MapReduce 2.0,Hadoop 2.X版本(引入了YARN資源調度框架后,除了支持MR,還支持其他計算模型
MR V1 執行流程
- JobTracker一直在等待JobClient提交作業;
- TaskTracker每隔3秒向 JobTracker發送心跳heartbeat詢問有沒有任務可做,如果有,讓其派發任務給它執行;
- 這是一道pull過程: slave主動向master拉生意;
MR v2 vs MR v1 流程
MR v2運行機制的改進,啟動了YARN
- 增加了ResourceManager、NodeManager;
- ResourceManager(RM), 包含:ApplicationManager、ResourceScheduler兩種功能;即把應用管理和資源調度分開;
- NodeManager(NM)負責節點的運行,當收到任務時,啟動Container完成(map或reduce)任務;
- ResourceManager對應于v1的JobTracker;
- NodeManager對應于v1的TaskTracker
MR V2 執行流程
- 用戶向YARN中提交應用程序,其中包括MR App Mstr程序、啟動ApplicationMaster的命令、數據等。
- ResourceManager為該應用程序分配第一個Container,并與對應的NodeManager通信,要求它在這個Container中啟動應用程序的ApplicationMaster。
- ApplicationMaster首先向ResourceManager注冊,這樣,用戶可以直接通過ResourceManager查看應用程序的運行狀態,然后,它將為各個任務申請資源,并監控它的運行狀態,直到運行結束,即重復步驟4~7
- ApplicationMaster采用輪詢的方式通過RPC協議向ResourceManager申請和領取資源。
- 一旦ApplicationMaster申請到資源后,則與對應的NodeManager通信,要求其啟動任務。
- NodeManager為任務設置好運行環境(包括環境變量、jar包、二進制程序等)后,將任務啟動命令寫到一個腳本中,并通過運行該腳本啟動任務
- 各個任務通過某個RPC 協議向ApplicationMaster匯報自己的狀態和進度,以讓ApplicationMaster 隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。在應用程序運行過程中,用戶可隨時通過RPC 向ApplicationMaster 查詢應用程序的當前運行狀態。
- 應用程序運行完成后,ApplicationMaster 向ResourceManager 注銷并關閉自己。
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端
- 在Map任務全部結束之前進行歸并
- 歸并得到大的文件放在本地磁盤
- 文件歸并時,如果溢寫文件數量大于預定值(默認是3)則可以再次啟動Combiner,少于3不需要
- JobTracker會一直監測Map任務的執行,并通知Reduce任務來領取數據
Shuffle的Reduce端
- Reduce任務通過RPC向JobTracker詢問Map任務是否已經完成,若完成,則領取數據
- Reduce領取數據先放入緩存,來自不同Map機器,先歸并,再合并寫入磁盤
- 多個溢寫文件歸并成一個或多個大文件,文件中的鍵值對是排序的
- 當數據很少時,不需要溢寫到磁盤,直接在緩存中歸并,然后輸出給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三大組件
- ResourceManager –處理客戶端請求
- 啟動/監控ApplicationMaster
- 監控NodeManager
- 資源分配與調度
- NodeManager –單個節點上的資源管理
- 處理來自ResourceManager的命令
- 處理來自ApplicationMaster的命令
- ApplicationMaster
- 數據切分
- 為應用程序申請資源,并分配給內部任務
- 任務監控與容錯
YARN資源調度器
- FIFO,先進先出調度器
- Fair Scheduler,公平調度器
- Capacity Scheduler,容量調度器