yarn調度器
試想一下,你現在所在的公司有一個hadoop的集羣。但是A項目組經常做一些定時的BI報表,B項目組則經常使用一些軟件做一些臨時需求。那麼他們肯定會遇到同時提交任務的場景,這個時候到底如何分配資源滿足這兩個任務呢?是先執行A的任務,再執行B的任務,還是同時跑兩個?
如果你存在上述的困惑,可以多瞭解一些yarn的資源調度器。
在Yarn框架中,調度器是一塊很重要的內容。有了合適的調度規則,就可以保證多個應用可以在同一時間有條不紊的工作。最原始的調度規則就是FIFO,即按照用戶提交任務的時間來決定哪個任務先執行,先提交的先執行。但是這樣很可能一個大任務獨佔資源,其他的資源需要不斷的等待。也可能一堆小任務佔用資源,大任務一直無法得到適當的資源,造成飢餓。所以FIFO雖然很簡單,但是並不能滿足我們的需求。
理想情況下,yarn應用發出的資源請求應該立刻給予滿足。然而現實中的資源有限,在一個繁忙的集羣上,一個應用經常需要等待才能得到所需的資源。yarn調度器的工作就是根據既定的策略爲應用分配資源。調度通常是一個難題,並且沒有一個所謂的“最好”的策略,這也是爲什麼yarn提供了多重調度器和可配置策略供我們選擇的原因。
yarn分爲一級調度管理和二級調度管理一級調度管理(更近底層,更接近於操作資源, 更偏向於應用層和底層結合) 計算資源管理(cpu,內存等,計算複雜消耗的cpu多) App生命週期管理二級調度管理(自己代碼的算法等, 更偏向於應用層) App內部的計算模型管理 多樣化的計算模型
1 調度器
在Yarn中有三種調度器可以選擇:FIFO Scheduler ,Capacity Scheduler,FairS cheduler
2 FIFO Scheduler
FIFO Scheduler把應用按提交的順序排成一個隊列,這是一個先進先出隊列,在進行資源分配的時候,先給隊列中最頭上的應用進行分配資源,待最頭上的應用需求滿足後再給下一個分配,以此類推。
FIFO Scheduler是最簡單也是最容易理解的調度器,也不需要任何配置,但它並不適用於共享集羣。大的應用可能會佔用所有集羣資源,這就導致其它應用被阻塞。在共享集羣中,更適合採用Capacity Scheduler或Fair Scheduler,這兩個調度器都允許大任務和小任務在提交的同時獲得一定的系統資源。
下面“Yarn調度器對比圖”展示了這幾個調度器的區別,從圖中可以看出,在FIFO 調度器中,小任務會被大任務阻塞。
3 Capacity Scheduler
默認使用容量調度器
而對於Capacity調度器,有一個專門的隊列用來運行小任務,但是爲小任務專門設置一個隊列會預先佔用一定的集羣資源,這就導致大任務的執行時間會落後於使用FIFO調度器時的時間。
如何配置容量調度器
隊列層級結構如下:
root
├── prod
└── dev
├── spark
└── hdp
主節點上,將$HADOOP_HOME/etc/hadoop/中的對應capacity-scheduler.xml配置文件備份到其它目錄
若hadoop集羣啓動,關閉hadoop集羣
在目錄$HADOOP_HOME/etc/hadoop/中建立一個新的capacity-scheduler.xml;內容如下。
將此xml文件,遠程拷貝到相同目錄下
重啓hadoop集羣
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>prod,dev</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.queues</name>
<value>hdp,spark</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
<value>75</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.hdp.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.spark.capacity</name>
<value>50</value>
</property>
</configuration>
將應用放置在哪個隊列中,取決於應用本身。
例如MR,可以通過設置屬性mapreduce.job.queuename指定相應隊列。以WordCount爲例,如下
如果指定的隊列不存在,則發生錯誤。如果不指定,默認使用"default"隊列,如下圖
4 Fair Scheduler
默認使用Capacity Scheduler
若要用Fair Scheduler的話,需要配置yarn-site.xml,將屬性"yarn.resourcemanager.scheduler.class"的值修改成"org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler",如下
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
注意:同樣,集羣中所有yarn-site.xml文件要同步更新
在Fair調度器中,我們不需要預先佔用一定的系統資源,Fair調度器會爲所有運行的job動態的調整系統資源。如下圖所示,當第一個大job提交時,只有這一個job在運行,此時它獲得了所有集羣資源;當第二個小任務提交後,Fair調度器會分配一半資源給這個小任務,讓這兩個任務公平的共享集羣資源。
需要注意的是,在下圖Fair調度器中,從第二個任務提交到獲得資源會有一定的延遲,因爲它需要等待第一個任務釋放佔用的Container。小任務執行完成之後也會釋放自己佔用的資源,大任務又獲得了全部的系統資源。最終的效果就是Fair調度器即得到了高的資源利用率又能保證小任務及時完成.
支持資源搶佔
在yarn-site.xml中設置yarn.scheduler.fair.preemption爲true
yarn應用狀態
我們在yarn 的web ui上能夠看到yarn 應用程序分爲如下幾個狀態:
-
NEW -----新建狀態
-
NEW_SAVING-----新建保存狀態
-
SUBMITTED-----提交狀態
-
ACCEPTED-----接受狀態
-
RUNNING-----運行狀態
-
FINISHED-----完成狀態
-
FAILED-----失敗狀態
-
KILLED-----殺掉狀態