MR详细运行原理及过程
文章目錄
MR的原理和運行流程Map的運行過程Reduce處理過程Shuffle過程MR運行過程Yarn && JobMR的原理和運行流程
Map的運行過程
以HDFS上的文件作為默認輸入源為例(MR也可以有其他的輸入源)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-419qFeIb-1589376928673)(https://github.com/jiaoqiyuan/163-bigdate-note/raw/master/%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%8F%8A%E8%AE%A1%E7%AE%97%EF%BC%9AMR/img/Map%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B.png “”)]
block是HDFS上的文件塊,split是文件的分片(邏輯劃分,不包含具體數(shù)據(jù),只包含這些數(shù)據(jù)的位置信息)。一個split包含一個或多個block,默認是一對一的關(guān)系。一個split不包含兩個文件的block, 不會跨越file邊界,也就是說一個split是不會跨文件進行劃分的。當(dāng)分片完成后,MR程序會將split中的數(shù)據(jù)以K/V(key/value)的形式讀取出來,然后將這些數(shù)據(jù)交給用戶自定義的Map函數(shù)進行處理。一個Map處理一個split。用戶用Map函數(shù)處理完數(shù)據(jù)后將處理后,同樣將結(jié)果以K/V的形式交給MR的計算框架。MR計算框架會將不同的數(shù)據(jù)劃分成不同的partition,數(shù)據(jù)相同的多個partition最后會分到同一個reduce節(jié)點上面進行處理,也就是說一類partition對應(yīng)一個reduce。Map默認使用Hash算法對key值進行Hash計算,這樣保證了相同key值的數(shù)據(jù)能夠劃分到相同的partition中,同時也保證了不同的partition之間的數(shù)據(jù)量時大致相當(dāng)?shù)?#xff0c;參考鏈接一個程序中Map和Reduce的數(shù)量是有split和partition的數(shù)據(jù)決定的。Reduce處理過程
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yDsRinfZ-1589376928676)(https://github.com/jiaoqiyuan/163-bigdate-note/raw/master/%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%8F%8A%E8%AE%A1%E7%AE%97%EF%BC%9AMR/img/Reduce%E5%A4%84%E7%90%86%E8%BF%87%E7%A8%8B.png “”)]
Map處理完后,reduce處理程序在各個Map節(jié)點將屬于自己的數(shù)據(jù)拷貝到自己的內(nèi)存緩沖區(qū)中 最后將這些數(shù)據(jù)合并成一個大的數(shù)據(jù)集,并且按照key值進行聚合,把聚合后的value值作為一個迭代器給用戶使用。 用戶使用自定義的reduce函數(shù)處理完迭代器中的數(shù)據(jù)后,一般把結(jié)果以K/V的格式存儲到HDFS上的文件中。Shuffle過程
在上面介紹的MR過程中,還存在一個shuffle過程,發(fā)生與Map和Reduce之中。[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nXBx9zAU-1589376928679)(https://github.com/jiaoqiyuan/163-bigdate-note/raw/master/%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%8F%8A%E8%AE%A1%E7%AE%97%EF%BC%9AMR/img/shuffle%E8%BF%87%E7%A8%8B.png “”)]
Map中的shuffle
Collec階段鍵數(shù)據(jù)放在環(huán)形緩沖區(qū),喚醒緩沖區(qū)分為數(shù)據(jù)區(qū)和索引區(qū)。 sort階段對在統(tǒng)一partition內(nèi)的索引按照key值排序。 spill(溢寫)階段根據(jù)拍好序的索引將數(shù)據(jù)按順序?qū)懙轿募小?Merge階段將Spill生成的小文件分批合并排序成一個大文件。 Reduce中的shuffleCopy階段將Map段的數(shù)據(jù)分批拷貝到Reduce的緩沖區(qū)。Spill階段將內(nèi)存緩沖區(qū)的數(shù)據(jù)按照順序?qū)懙轿募小erge階段將溢出文件合并成一個排好序的數(shù)據(jù)集。 Combine優(yōu)化整個過程中可以提前對聚合好的value值進行計算,這個過程就叫Combine。Combine在Map端發(fā)生時間在數(shù)據(jù)排序后,溢寫到磁盤前,相同key值的value是緊挨在一起的,可以進行聚合運算,運行一次combiner。再合并溢出文件輸出到磁盤前,如果存在至少3個溢出文件,則運行combiner,可以通過min.num.spills.for.combine設(shè)置閾值。Reduce端在合并溢出文件輸出到磁盤前,運行combiner。Combiner不是任何情況下都適用的,需要根據(jù)業(yè)務(wù)需要進行設(shè)置。MR運行過程
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RJX3RjGX-1589376928682)(https://github.com/jiaoqiyuan/163-bigdate-note/raw/master/%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%8F%8A%E8%AE%A1%E7%AE%97%EF%BC%9AMR/img/MR%E8%BF%90%E8%A1%8C%E8%BF%87%E7%A8%8B.png “”)]
一個文件分成多個split數(shù)據(jù)片。 每個split由多一個map進行處理。 Map處理完一個數(shù)據(jù)就把處理結(jié)果放到一個環(huán)形緩沖區(qū)內(nèi)存中。 環(huán)形緩沖區(qū)滿后里面的數(shù)據(jù)會被溢寫到一個個小文件中。 小文件會被合并成一個大文件,大文件會按照partition進行排序。 reduce節(jié)點將所有屬于自己的數(shù)據(jù)從partition中拷貝到自己的緩沖區(qū)中,并進行合并。 最后合并后的數(shù)據(jù)交給reduce處理程序進行處理。 處理后的結(jié)果存放到HDFS上。 MR運行在集群上:YARN(Yet Another Resource Negotiator)[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gxnQd48w-1589376928686)(https://github.com/jiaoqiyuan/163-bigdate-note/raw/master/%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%8F%8A%E8%AE%A1%E7%AE%97%EF%BC%9AMR/img/YARN%E6%A1%86%E6%9E%B6.png “”)]
__ ResourceManager負責(zé)調(diào)度和管理整個集群的資源__
-
主要職責(zé)是調(diào)度,對應(yīng)用程序的整體進行資源分配
-
Nodemanager負責(zé)節(jié)點上的計算資源,內(nèi)部包含Container, App Master,管理Container生命周期,資源使用情況,節(jié)點健康狀況,并將這些信息回報給RM。
- Container中包含一些資源信息,如cpu核數(shù),內(nèi)存大小
- 一個應(yīng)用程序由一個App Master管理,App Master負責(zé)將應(yīng)用程序運行在各個節(jié)點的Container中,App Master與RM協(xié)商資源分配的問題。
-
MapReduce On Yarn
1
2
3
4
5
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nCnd4etj-1589376928688)(https://github.com/jiaoqiyuan/163-bigdate-note/raw/master/%E6%97%A5%E5%BF%97%E8%A7%A3%E6%9E%90%E5%8F%8A%E8%AE%A1%E7%AE%97%EF%BC%9AMR/img/MRonYarn.png “”)]
-
MR程序在客戶端啟動,客戶端會向RM發(fā)送一個請求。
-
RM收到請求后返回一個AppID給客戶端。
-
然后客戶端拿著AppID,用戶名,隊列,令牌向RM發(fā)出資源請求。
-
客戶端這時會將程序用到的jar包,資源文件,程序運行中需要的數(shù)據(jù)等傳送到HDFS上。
-
RM接收到客戶端的資源請求后,分配一個container0的資源包,由NodeManager啟動一個AppMaster。
-
RM將集群的容量信息發(fā)送給AppMaster,AppMaster計算這個程序需要的資源量后,根據(jù)需要想RM請求更多的container。
-
最后由各個NodeManager在節(jié)點上啟動MapTask和ReduceTask。
1
2
3
4
5
6
7
Yarn && Job
上面的 Yarn 管理 MR 任務(wù)是不是比較粗略,下面我將介紹比較詳細的處理流程:
這也是今日頭條的一個面試題,引發(fā)的思考:
MR 任務(wù)為例,講一下 Yarn 的整個過程。Yarn 中的主要組件包括:Resourcemanager,ApplicationMaster, NodeManager。
Resourcemanager:每個Hadoop集群只會有一個ResourceManager(如果是HA的話會存在兩個,但是有且只有一個處于active狀態(tài)),啟動每一個 Job 所屬的 ApplicationMaster,另外監(jiān)控ApplicationMaster 以及NodeManager 的存在情況,并且負責(zé)協(xié)調(diào)計算節(jié)點上計算資源的分配。ResourceManager 內(nèi)部主要有兩個組件:
Scheduler:這個組件完全是插拔式的,用戶可以根據(jù)自己的需求實現(xiàn)不同的調(diào)度器,目前YARN提供了FIFO、容量以及公平調(diào)度器。這個組件的唯一功能就是給提交到集群的應(yīng)用程序分配資源,并且對可用的資源和運行的隊列進行限制。Scheduler并不對作業(yè)進行監(jiān)控; ApplicationsManager :這個組件用于管理整個集群應(yīng)用程序的 application masters,負責(zé)接收應(yīng)用程序的提交;為application master啟動提供資源;監(jiān)控應(yīng)用程序的運行進度以及在應(yīng)用程序出現(xiàn)故障時重啟它。ApplicationMaster:每個 Job 都有對應(yīng)一個 ApplicationMaster ,并且負責(zé)運行 mapreduce 任務(wù),并負責(zé)報告任務(wù)的狀態(tài)。ApplicationMaster是應(yīng)用程序級別的,每個ApplicationMaster管理運行在YARN上的應(yīng)用程序。YARN 將 ApplicationMaster看做是第三方組件,ApplicationMaster負責(zé)和ResourceManager scheduler協(xié)商資源,并且和NodeManager通信來運行相應(yīng)的task。ResourceManager 為 ApplicationMaster 分配容器,這些容器將會用來運行task。ApplicationMaster 也會追蹤應(yīng)用程序的狀態(tài),監(jiān)控容器的運行進度。當(dāng)容器運行完成, ApplicationMaster 將會向 ResourceManager 注銷這個容器;如果是整個作業(yè)運行完成,其也會向 ResourceManager 注銷自己,這樣這些資源就可以分配給其他的應(yīng)用程序使用了。
NodeManager:負責(zé)啟動和管理節(jié)點的容器。NodeManager是YARN中每個節(jié)點上的代理,它管理Hadoop集群中單個計算節(jié)點,根據(jù)相關(guān)的設(shè)置來啟動容器的。NodeManager會定期向ResourceManager發(fā)送心跳信息來更新其健康狀態(tài)。同時其也會監(jiān)督Container的生命周期管理,監(jiān)控每個Container的資源使用(內(nèi)存、CPU等)情況,追蹤節(jié)點健康狀況,管理日志和不同應(yīng)用程序用到的附屬服務(wù)(auxiliary service)。
Container: Container是與特定節(jié)點綁定的,其包含了內(nèi)存、CPU磁盤等邏輯資源。不過在現(xiàn)在的容器實現(xiàn)中,這些資源只包括了內(nèi)存和CPU。容器是由 ResourceManager scheduler 服務(wù)動態(tài)分配的資源構(gòu)成。容器授予 ApplicationMaster 使用特定主機的特定數(shù)量資源的權(quán)限。ApplicationMaster 也是在容器中運行的,其在應(yīng)用程序分配的第一個容器中運行。
必須牢記yarn只是一個資源管理的框架,并不是一個計算框架,計算框架可以運行在yarn上。我們所能做的就是向RM申請container,然后配合NM一起來啟動container。下面是請求資源和分配資源的流程:
1.客戶端向 ResourceManager 發(fā)送 job 請求,客戶端產(chǎn)生的 RunJar 進程與 ResourceManager 通過 RPC 通信。
2.ResourceManager 向客戶端返回 job 相關(guān)資源的提交路徑以及 jobID。
3.客戶端將 job 相關(guān)的資源提交到相應(yīng)的共享文件夾下。
4.客戶端向 ResourceManager 提交 job
5.ResourceManager 通過__調(diào)度器__在 NodeManager 創(chuàng)建一個容器,并且在容器中啟用MRAppmaster 進程,該進程由 ResourceManager 啟動。
6.該 MRAppmaster 進程對作業(yè)進行初始化,創(chuàng)建多個對象對作業(yè)進行跟蹤。
7.MRAppmaster 從文件系統(tǒng)獲取計算得到輸入分片,只獲取切片信息,不需要jar等資源,為每個分片創(chuàng)建一個 map 以及指定數(shù)量的 reduce 對象,之后 MRAppmaster 決定如何運行構(gòu)成 mapreduce 的各個任務(wù)。
8.若作業(yè)很大,MRAppmaster 為所有的 map 任務(wù)和reduce 任務(wù)向 ResourceManger 發(fā)起申請容器的請求,請求中包含 map 任務(wù)的數(shù)據(jù)本地化信息以及數(shù)據(jù)分片等信息。
9.ResourceManager 為任務(wù)分配了容器之后,MRAppmaster 就通過 與 NodeManger 通信啟動容器,由 MRAppmaster 負責(zé)分配在哪些 NodeManager 負責(zé)分配在哪些 NodeManager 上運行map (即 yarnchild 進程)和reduce 任務(wù)。
10.運行 mao 和 reduce 任務(wù)的 NodeManager 從共享系統(tǒng)中獲取 job 的相關(guān)縣,包括 jar 文件,配置文件等。
11.關(guān)于查詢狀態(tài),不經(jīng)過 reourcemanager ,而是任務(wù)周期性的 MRAppmaster 匯報狀態(tài)以及進度,客戶端每秒通過查詢一次 MRAppmaster 來更新狀態(tài)和信息。
上面可以很亂,重點是輔助理解細節(jié),認知到位了,無關(guān)細節(jié)了吧。
下面總結(jié)一下,大概的流程:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-X10IXJnE-1589376928689)(https://cdn.nlark.com/yuque/0/2018/png/199648/1544534623921-5cd78e48-8181-404c-a67b-41898ca4574a.png “”)]
流程大致如下:
· client客戶端向yarn集群(resourcemanager)提交任務(wù)
· resourcemanager選擇一個node創(chuàng)建appmaster
· appmaster根據(jù)任務(wù)向rm申請資源
· rm返回資源申請的結(jié)果
· appmaster去對應(yīng)的node上創(chuàng)建任務(wù)需要的資源(container形式,包括內(nèi)存和CPU)
· appmaster負責(zé)與nodemanager進行溝通,監(jiān)控任務(wù)運行
· 最后任務(wù)運行成功,匯總結(jié)果。
其中Resourcemanager里面一個很重要的東西,就是調(diào)度器Scheduler,調(diào)度規(guī)則可以使用官方提供的,也可以自定義。
總結(jié)
以上是生活随笔為你收集整理的MR详细运行原理及过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive问题-return code 2
- 下一篇: 4.MR过程分析