Hadoop Yarn 資源調(diào)度器解析篇
Yarn資源調(diào)度器簡介
資源調(diào)度器是Yarn中最核心的組件之一惕耕,他是ResourceManager中的一個可插拔的服務(wù)組件,負責整個集群的管理和分配;
目前Yarn中的作業(yè)類型:
1.批處理作業(yè),這種作業(yè)比較耗時赘阀,對時間的完成沒有嚴格要求,如數(shù)據(jù)挖掘和機器學習等;
2.交互式作業(yè),這種作業(yè)一半希望能夠及時的返回結(jié)果樱溉,例如:hive的sql查詢;
3.生產(chǎn)性作業(yè):這種作業(yè)要求有一定量的資源保證紫谷,如統(tǒng)計值計算,垃圾數(shù)據(jù)分析等;
為了滿足多用戶多隊列的資源分配問題以及Yarn自帶的FIFO(先進先出資源調(diào)度器)單隊列的問題齐饮,又引入了Yahoo的Capacity Scheduler和FaceBook的Fair Scheduler;
Yarn的資源調(diào)度器的基本架構(gòu)
資源調(diào)度器作為Yarn中的可插拔的資源調(diào)度器,它定義了一套接口規(guī)范以便用戶可按照規(guī)范實現(xiàn)自己的調(diào)度器笤昨,本文主要從資源調(diào)度器的可插拔性和時間處理器兩方面來說;
1.ResourceScheduler之插拔式組件
在ResourceManager初始化的時候會根據(jù)用戶的配置來創(chuàng)建一個具體的資源調(diào)度對象,通過配置文件yarn.resourcemanager.scheduler.class指定,如下代碼:
protected ResourceScheduler createScheduler() {
String schedulerClassName = conf.get(YarnConfiguration.RM_SCHEDULER,
YarnConfiguration.DEFAULT_RM_SCHEDULER);
LOG.info("Using Scheduler: " + schedulerClassName);
try {
Class<?> schedulerClazz = Class.forName(schedulerClassName);
if (ResourceScheduler.class.isAssignableFrom(schedulerClazz)) {
return (ResourceScheduler) ReflectionUtils.newInstance(schedulerClazz,
this.conf);
} else {
throw new YarnRuntimeException("Class: " + schedulerClassName
+ " not instance of " + ResourceScheduler.class.getCanonicalName());
}
} catch (ClassNotFoundException e) {
throw new YarnRuntimeException("Could not instantiate Scheduler: "
+ schedulerClassName, e);
}
}
資源調(diào)度器的實現(xiàn)必須實現(xiàn)ResourceScheduler接口,代碼如下:
@LimitedPrivate("yarn")
@Evolving
public interface ResourceScheduler extends YarnScheduler, Recoverable {
/**
* Set RMContext for <code>ResourceScheduler</code>.
* This method should be called immediately after instantiating
* a scheduler once.
* @param rmContext created by ResourceManager
*/
void setRMContext(RMContext rmContext);
/**
* Re-initialize the <code>ResourceScheduler</code>.
* @param conf configuration
* @throws IOException
*/
void reinitialize(Configuration conf, RMContext rmContext) throws IOException;
}
而ResourceScheduler實現(xiàn)了YarnScheduler接口祖驱,代碼如下:
public interface YarnScheduler extends EventHandler<SchedulerEvent> {
/**
* Get queue information
* @param queueName queue name
* @param includeChildQueues include child queues?
* @param recursive get children queues?
* @return queue information
* @throws IOException
*/
//todo 獲取一個隊列信息
@Public
@Stable
public QueueInfo getQueueInfo(String queueName, boolean includeChildQueues,
boolean recursive) throws IOException;
/**
* Get acls for queues for current user.
* @return acls for queues for current user
*/
//todo 返回當前用戶的隊列Acl權(quán)限
@Public
@Stable
public List<QueueUserACLInfo> getQueueUserAclInfo();
.......
2.ResourceScheduler之事件處理器
Yarn的資源管理器實際上是一個事件處理器,他需要處理來自外部不同的事件,如下圖所示:
資源表示模型
當前Yarn支持內(nèi)存和CPU兩種資源類型的管理和分配瞒窒,同MR1一樣捺僻,Yarn采用了動態(tài)資源分配機制,NM會向RM注冊崇裁,注冊信息里包含了該節(jié)點可分配的CPU和內(nèi)存總量;
這兩個值是可以配置的:
yarn.nodemanager.resource.memory-mb : 可分配的物理內(nèi)存總量,默認8G;
yarn.nodemanager.vmem-pmem-ratio : 使用單位物理內(nèi)存可分配的虛擬內(nèi)存量匕坯,默認2.1;
yarn.nodemanager.resource.cpu-vcores: 可分配虛擬CPU的個數(shù),默認是8;
Yarn支持的調(diào)度語義:
- 請求某個特定節(jié)點上的特定資源量: 例如請求nodex節(jié)點上5個 2vcpu,2GB的Container;
- 請求某個特定機架上的特定資源量: 例如請求rackx上的3個 4vcpu,2GB的Container;
- 將某些節(jié)點加入或者移除黑名單拔稳,不再為自己分配這些節(jié)點上的資源;
- 請求歸還某些資源,例如ApplicationMaster將閑置的Container歸還給集群;
不支持的調(diào)度語義:
- 請求任意節(jié)點上的特定資源量: 例如請求任意節(jié)點上5個 2vcpu,2GB的Container;
- 請求任意機架上的特定資源量: 例如請求同一機架上的3個 4vcpu,2GB的Container;
- 請求一組或者幾組符合某種特質(zhì)的資源醒颖,例如請求兩個機架上的4個2vcpu,2GB的Container和4vcpu,2GB的Container,如果集群中沒有則需要從其他應(yīng)用程序搶占資源;
- 超細粒度的資源: 例如CPU性能要求,綁定CPU壳炎;
- 動態(tài)調(diào)整Container資源泞歉,應(yīng)允許根據(jù)需要冬天調(diào)整Container資源量;
資源調(diào)度模型
1.雙層資源調(diào)度模型
在第一層中,ResourceManager中的資源調(diào)度器將資源分配給各個ApplicationMaster;
在第二層中匿辩,ApplicationMaster再進一步將資源分配給它內(nèi)部的各個任務(wù)
第一層的調(diào)度模型如下圖所示:
2.資源保證機制
在分布式計算中腰耙,資源調(diào)度器需要選擇合適峰資源保證這樣的機制,當應(yīng)用程序申請的資源暫時無法保證時:
1.是優(yōu)先為應(yīng)用程序預(yù)留一個節(jié)點上的資源直到累計釋放的空閑資源滿足應(yīng)用程序需求(稱為“增量資源分配”)
2.還是暫時放棄當前資源直到出現(xiàn)一個節(jié)點剩余資源一次性滿足應(yīng)用程序需求(稱為“一次性資源分配”)
這兩種機制均存在優(yōu)缺點,對于增量資源分配來說铲球,資源預(yù)留會導致資源浪費挺庞,降低集群資源利用率;而一次性資源分配則會產(chǎn)生餓死現(xiàn)象稼病,即應(yīng)用程序可能永遠等不到滿足資源需求的節(jié)點出現(xiàn),YARN采用了增量資源分配機制 选侨,盡管這種機制會造成浪費,但不會出現(xiàn)餓死現(xiàn)象;
3.資源分配算法
為了支持多維資源調(diào)度然走,YARN資源調(diào)度器采用了主資源公平調(diào)度算法(DRF)援制,該算法擴展了最大最小公平算法,使其能夠支持多維資源的使用在DRF算法中芍瑞,將所需份額(資源比例)最大的資源稱為主資源晨仑,而DRF的基本設(shè)計思想則是將最大最小公平算法應(yīng)用于主資源上,進而將多維資源調(diào)度問題轉(zhuǎn)化為單資源調(diào)度問題,即DRF總是最大化所有主資源中最小的;
資源搶占模型
在資源調(diào)度器中洪己,每個隊列可設(shè)置一個最小資源量和最大資源量妥凳,其中,最小資源量是資源緊缺情況下每個隊列需保證的資源量答捕,而最大資源量則是極端情況下隊列也不能超過的資源使用量逝钥。資源搶占發(fā)生的原因則完全是由于“最小資源量”這一概念;
資源調(diào)度器之Capacity Scheduler
Capacity Scheduler是Yahoo開發(fā)的多用戶調(diào)度器,它以隊列為單位拱镐,每個隊列可設(shè)定一定比例的資源最低保證和使用上限艘款,同時每個用戶也可以設(shè)定一定的資源使用上限以防止資源濫用。當一個隊列的資源有剩余時痢站,可暫時將剩余資源共享給其他隊列;
Capacity Scheduler特點:
- 容量保證:管理員可以為每個隊列設(shè)置資源的最低保證和使用上限磷箕,而所有提交到該隊列的應(yīng)用程序共享這些資源;
- 靈活性: 當一個隊列的資源有剩余時选酗,可暫時將剩余資源共享給其他隊列,一旦該隊列有閑的應(yīng)用程序提交阵难,則其他隊列釋放的資源會歸還該隊列;
- 多重租賃: 支持多用戶共享集群和多應(yīng)用程序同時運行;
- 安全性保證: 每個隊列都有嚴格的ACL列表規(guī)定他的訪問用戶;
- 動態(tài)更新配置文件: 管理員可根據(jù)需要動態(tài)修改各種配置參數(shù),以實現(xiàn)集群的在線管理;
Capacity Scheduler配置參數(shù)
1.資源分配相關(guān)參數(shù)
capacity: 隊列的容量(百分比)
maximum-capacity: 隊列資源的使用上限(百分比)
minimum-user-limit-percent:每個用戶最低資源保障(百分比)
user-limit-factor: 每個用戶最多可使用的資源量(百分比)
2.限制應(yīng)用程序數(shù)目的配置參數(shù)
maximum-applications: 集群或者隊列總同時處于等待和運行狀態(tài)的應(yīng)用程序數(shù)目上限,默認10000
maximum-am-resource-percent: 集群中用于運行應(yīng)用程序ApplicationMaster的資源比例上限芒填,
該參數(shù)通常用于限制處于活動狀態(tài)的應(yīng)用程序的數(shù)目,默認0.1(10%)
3.隊列訪問和權(quán)限控制參數(shù)
state: 隊列狀態(tài)stopped/running,可以實現(xiàn)隊列的優(yōu)雅退出
acl_submit_application: 限定哪些用戶或者用戶組可向給定的隊列中提交應(yīng)用程序,具有繼承性
acl_administer_queue: 為隊列指定一個管理員
其他的配置參數(shù)點擊配置文件來查看呜叫;
從以上參數(shù)可見,Capacity Scheduler將整個系統(tǒng)資源劃分為若干個隊列,并且每個隊列有較為嚴格的資源控制,通過這些控制Capacity Scheduler將hadoop集群在邏輯上劃分為多個擁有相對獨立資源的子集群殿衰,而這些子集群可以共享大集群的資源;
Capacity Scheduler的實現(xiàn)
1.應(yīng)用程序的初始化:
應(yīng)用程序提交到RM上后朱庆,RM會向Capacity Scheduler發(fā)送一個APP_ADDED事件,Capacity Scheduler收到之后會創(chuàng)建一個FiCaschedulerApp對象用于跟蹤和維護該應(yīng)用程序的運行時信息,同時將該應(yīng)用程序提交給對應(yīng)的葉子隊列闷祥;
2.資源調(diào)度
當RM收到來自NM的心跳信息后娱颊,會想Capacity Scheduler發(fā)送NODE_UPDATE事件,而Capacity Scheduler接收到該事件之后會完成以下操作:
(1)處理心跳信息
NM發(fā)送的心跳信息中有兩類信息需要資源資源調(diào)度器處理,一類是新啟動Container凯砍,另一類是運行完成的Container,具體如下:
新啟動的Container: 資源調(diào)度器需要向RM發(fā)送一個RMContainerEventType.LAUNCHED事件幔妨,進而將該Container從超時隊列中移除;
運行完成的Container: 資源調(diào)度器將回收它的資源彪薛,然后資源再分配;
(2)資源分配
用戶提交應(yīng)用程序后,應(yīng)用程序會為對應(yīng)的ApplicationMaster申請資源,而資源的表示方式是Container,Container表示信息如下圖所示:
Yarn采用了三級資源分配策略,當一個節(jié)點上有空閑資源的時候,它會依次選擇隊列肩狂,應(yīng)用程序,Container使用該資源,如下圖所示:
步驟一: Yarn采用層次結(jié)構(gòu)組織隊列,將隊列轉(zhuǎn)換成樹形結(jié)構(gòu),從根節(jié)點開始按照子隊列的資源使用率從小到大遍歷各個子隊列诞仓,如果子隊列是葉子節(jié)點洒沦,則進行步驟二尋找合適的Container,否則以該子隊列為根節(jié)點重復(fù)以上過程;
步驟二: 步驟一選中一個葉子節(jié)點后Capacity Scheduler會按照應(yīng)用程序的提交順序進行排序,并遍歷排序后的應(yīng)用程序找到一個或者多個最合適的Container挑势;
步驟三: 當步驟二選中給一個應(yīng)用程序后镇防,Capacity Scheduler將先滿足優(yōu)先級較高的Container,對于同一優(yōu)先級的Container根據(jù)本地性來選擇潮饱,它會一次選擇node local,rack local和no local的Container;
資源調(diào)度器之Fair Scheduler
Fair Scheduler簡介
Fair Scheduler是FaceBook開發(fā)的多用戶調(diào)度器营罢,同Capacity Scheduler類似,它以隊列為單位劃分資源,每個隊列可以設(shè)置一定比例的資源最低保證和使用上限,同時每個用戶也可設(shè)定一定的資源使用上限以防止資源濫用,當一個隊列有資源剩余的時候可以共享給其他隊列,Fair Scheduler和Capacity Scheduler的不同之處如下:
資源公平共享: 在每個隊列中,F(xiàn)air Scheduler可根據(jù)選擇按照FiFO饲漾,F(xiàn)air和DRF策略為應(yīng)用程序分配資源,其中Fair策略是根據(jù)一種基于最大最小公平算法實現(xiàn)的資源多路復(fù)用方式,默認情況下蝙搔,每個隊列都按照該方式分配資源,如果一個隊列中有兩個應(yīng)用程序,則每個應(yīng)用程序可得到1/2的資源;
支持資源搶占: 當某個隊列中有剩余資源時考传,調(diào)度器會將這些資源共享給其他隊列吃型,而當該隊列中有新的應(yīng)用程序提交時,調(diào)度器要為它回收資源僚楞,為了降低不必要的計算浪費勤晚,調(diào)度器會采用先等待再回收的策略,如果等待一段時間后未歸還泉褐,則從哪些超額使用資源的隊列中殺死一部分任務(wù)赐写,進而釋放資源;
負載均衡: Fair Scheduler提供了一個基于任務(wù)數(shù)目的負載均衡機制,該機制盡可能的將系統(tǒng)總的任務(wù)均勻分配到各個節(jié)點;
提高小應(yīng)用的相應(yīng)時間: 由于采用最大最小公平算法,小應(yīng)用可以快速獲取資源并運行完成;
Fair Scheduler中添加了新特性膜赃,點擊配置文件來查看挺邀;
Fair Scheduler的實現(xiàn)
Fair Scheduler的實現(xiàn)和Capacity Scheduler基本一致,同Capacity Scheduler不同的是Fair Scheduler提供了更多樣化的調(diào)度策略跳座,它允許每個隊列單獨配置調(diào)度策略,分別有:FIFO,Fair和DRF端铛;
調(diào)度策略在隊列間和隊列內(nèi)部可以單獨設(shè)置,對于葉子隊列疲眷,他設(shè)置的調(diào)度策略決定了內(nèi)部的應(yīng)用程序的調(diào)度策略,對于非葉子節(jié)點禾蚕,他設(shè)置的調(diào)度策略決定了各個子隊列間的調(diào)度策略;
同Capacity Scheduler一樣,F(xiàn)air Scheduler也采用了三級資源分配策略狂丝,即當一個節(jié)點有空閑資源時换淆,它會依次選擇隊列,應(yīng)用程序几颜,Container倍试,這里就不再重復(fù)敘述;
其實Yarn采用的層次結(jié)構(gòu)組織隊列菠剩,實際存放應(yīng)用程序的只有葉子隊列易猫,其他隊列只是一個邏輯概念,用以輔助計算葉子隊列的資源量;
Capacity Scheduler和Fair Scheduler的比較
參考:
《Hadoop技術(shù)內(nèi)幕 : 深入解析YARN架構(gòu)設(shè)計與實現(xiàn)原理》