Yarn是一個資源調度平臺,負責爲運算程序提供服務器運算資源,相當於一個分佈式的操作平臺,而MapReduce等運算程序則相當於運行於操作系統之上的應用程序。
一、Yarn基本架構
Yarn
主要由ResourceManager
、NodeManager
、ApplicationMaster
、Container
等組件構成。
-
ResourceManager(RM)
的主要作用:(1)處理客戶端請求;
(2)監控
NodeManager
;(3)啓動或監控
ApplicationMaster
;(4)資源的分配與調度。
-
NodeManager(NM)
的主要作用:(1)管理單個節點上的資源;
(2)處理來自
ResourceManager
的命令;(3)處理來自
ApplicationMaster
的命令。 -
ApplicationMaster(AM)
的主要作用:(1)負責數據的切分;
(2)爲應用程序申請資源並分配給內部的任務;
(3)任務的監控與容錯
-
Container
的主要作用:Container
是Yarn中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等。
二、Yarn工作機制
MR
程序提交到客戶端所在的節點。YarnRunner
向ResourceManager
申請一個Application
RM
將該應用程序的資源路徑返回給YarnRunner
- 該程序將運行所需資源提交到
HDFS
上 - 程序資源提交完畢後,申請運行
mrAppMaster
RM
將用戶的請求初始化成一個Task
- 其中一個
NodeManager
領取到Task
任務 - 該
NodeManager
創建容器Container
,併產生MRAppmaster
Container
從HDFS
上拷貝資源到本地MRAppmaster
向RM 申請運行MapTask
資源RM
將運行MapTask
任務分配給另外兩個NodeManager
,另兩個NodeManager
分別領取任務並創建容器MR
向兩個接收到任務的NodeManager
發送程序啓動腳本,這兩個NodeManager
分別啓動MapTask
,MapTask
對數據分區排序MrAppMaster
等待所有MapTask
運行完畢後,向RM申請容器,運行ReduceTask
ReduceTask
向MapTask
獲取相應分區的數據- 程序運行完畢後,
MR
會向RM
申請註銷自己。
三、job提交全過程
job提交過程之Yarn:
-
作業提交
第1步:
Client
調用job.waitForCompletion
方法,向整個集羣提交MapReduce
作業。第2步:
Client
向RM申請一個作業id
。第3步:
RM
給Client
返回該job
資源的提交路徑和作業id
。第4步:
Client
提交jar
包、切片信息和配置文件到指定的資源提交路徑。第5步:
Client
提交完資源後,向RM
申請運行MrAppMaster
。 -
作業初始化
第6步:當RM收到
Client
的請求後,將該job
添加到容量調度器中。第7步:某一個空閒的
NM
領取到該Job
。第8步:該
NM
創建Container
,併產生MRAppmaster
。第9步:下載
Client
提交的資源到本地。 -
任務分配
第10步:
MrAppMaster
向RM申請運行多個MapTask
任務資源。第11步:
RM
將運行MapTask
任務分配給另外兩個NodeManager
,另兩個NodeManager
分別領取任務並創建容器。 -
任務運行
第12步:
MR
向兩個接收到任務的NodeManager
發送程序啓動腳本,這兩個NodeManager
分別啓動MapTask
,MapTask
對數據分區排序。第13步:
MrAppMaster
等待所有MapTask
運行完畢後,向RM申請容器,運行ReduceTask
。第14步:
ReduceTask
向MapTask
獲取相應分區的數據。第15步:程序運行完畢後,
MR
會向RM
申請註銷自己。 -
進度和狀態更新
YARN
中的任務將其進度和狀態(包括counter
)返回給應用管理器, 客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval
設置)嚮應用管理器請求進度更新, 展示給用戶。 -
作業完成
除了嚮應用管理器請求作業進度外, 客戶端每5秒都會通過調用
waitForCompletion()
來檢查作業是否完成。時間間隔可以通過mapreduce.client.completion.pollinterval
來設置。作業完成之後, 應用管理器和Container
會清理工作狀態。作業的信息會被作業歷史服務器存儲以備之後用戶覈查。
job提交過程之MapReduce:
四、資源調度器
目前,Hadoop
作業調度器主要有三種:FIFO
、Capacity Scheduler
和Fair Scheduler
。Hadoop2.7.2
默認的資源調度器是Capacity Scheduler
。
具體設置詳見:yarn-default.xml
文件:
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
-
先進先出調度器(
FIFO
)
-
容量調度器(
Capacity Scheduler
)
(1)支持多個隊列,每個隊列可配置一定的資源量,每個隊列採用FIFO調度策略。(2)爲了防止同一個用戶的作業獨佔隊列中的資源,該調度器會對同一用戶提交的作業所佔資源量進行限定。
(3)首先,計算每個隊列中正在運行的任務數與其應該分得的計算資源之間的比值,選擇一個該比值最小的隊列——最閒的。
(4)其次,按照作業優先級和提交時間順序,同時考慮用戶資源量限制和內存限制對隊列內任務排序。
(5)三個隊列同時按照任務的先後順序依次執行,比如,
job11
、job21
和job31
分別排在隊列最前面,先運行,也是並行運行。 -
公平調度器(
Fair Scheduler
)
(1)支持多隊列多用戶,每個隊列中的資源量可以配置,同一隊列中的作業公平共享隊列中所有資源。比如有三個隊列:queueA
、queueB
和queueC
,每個隊列中的job
按照優先級分配資源,優先級越高分配的資源越多,但是每個job
都會分配到資源以確保公平。(2)在資源有限的情況下,每個
job
理想情況下獲得的計算資源與實際獲得的計算資源存在一種差距,這個差距就叫做缺額。(3)在同一個隊列中,
job
的資源缺額越大,越先獲得資源優先執行。作業是按照缺額的高低來先後執行的,而且可以看到上圖有多個作業同時運行。
五、任務的推測執行
-
作業完成時間取決於最慢的任務完成時間
一個作業由若干個
Map
任務和Reduce
任務構成。因硬件老化、軟件Bug
等,某些任務可能運行非常慢。思考:系統中有
99%
的Map
任務都完成了,只有少數幾個Map
老是進度很慢,完不成,怎麼辦? -
推測執行機制
發現拖後腿的任務,比如某個任務運行速度遠慢於任務平均速度。爲拖後腿任務啓動一個備份任務,同時運行。誰先運行完,則採用誰的結果。
-
執行推測任務的前提條件
(1)每個
Task
只能有一個備份任務(2)當前
Job
已完成的Task
必須不小於0.05(5%)
(3)開啓推測執行參數設置,
mapred-site.xml
文件中默認是打開的。<property> <name>mapreduce.map.speculative</name> <value>true</value> <description>If true, then multiple instances of some map tasks may be executed in parallel.</description> </property> <property> <name>mapreduce.reduce.speculative</name> <value>true</value> <description>If true, then multiple instances of some reduce tasks may be executed in parallel.</description> </property>
-
不能啓用推測執行機制情況
(1)任務間存在嚴重的負載傾斜;
(2)特殊任務,比如任務向數據庫中寫數據。
-
推測執行算法原理
假設某一時刻,任務T的執行進度爲
progress
,則可通過一定的算法推測出該任務的最終完成時刻estimateEndTime
。另一方面,如果此刻爲該任務啓動一個備份任務,則可推斷出它可能的完成時刻estimateEndTime
`,於是可得出以下幾個公式:estimatedRunTime =(currentTimestamp - taskStartTime) / progress 推測運行時間(60s) =(當前時刻(6) - 任務啓動時刻(0)) / 任務運行比例(10%) estimateEndTime = estimatedRunTime + taskStartTime 推測執行完時刻 60 = 推測運行時間(60s) + 任務啓動時刻(0) estimateEndTime` = currentTimestamp + averageRunTime 備份任務推測完成時刻(16)= 當前時刻(6) + 運行完成任務的平均時間(10s)
(1)MR總是選擇(
estimateEndTime
-estimateEndTime
` )差值最大的任務,併爲之啓動備份任務。(2)爲了防止大量任務同時啓動備份任務造成的資源浪費,MR爲每個作業設置了同時啓動的備份任務數目上限。
(3)推測執行機制實際上採用了經典的優化算法:以空間換時間,它同時啓動多個相同任務處理相同的數據,並讓這些任務競爭以縮短數據處理時間。顯然,這種方法需要佔用更多的計算資源。在集羣資源緊缺的情況下,應合理使用該機制,爭取在多用少量資源的情況下,減少作業的計算時間。