Hadoop Yarn 資源調(diào)度器解析

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的資源管理器實際上是一個事件處理器,他需要處理來自外部不同的事件,如下圖所示:

image

資源表示模型

當前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)度語義:

  1. 請求某個特定節(jié)點上的特定資源量: 例如請求nodex節(jié)點上5個 2vcpu,2GB的Container;
  2. 請求某個特定機架上的特定資源量: 例如請求rackx上的3個 4vcpu,2GB的Container;
  3. 將某些節(jié)點加入或者移除黑名單拔稳,不再為自己分配這些節(jié)點上的資源;
  4. 請求歸還某些資源,例如ApplicationMaster將閑置的Container歸還給集群;

不支持的調(diào)度語義:

  1. 請求任意節(jié)點上的特定資源量: 例如請求任意節(jié)點上5個 2vcpu,2GB的Container;
  2. 請求任意機架上的特定資源量: 例如請求同一機架上的3個 4vcpu,2GB的Container;
  3. 請求一組或者幾組符合某種特質(zhì)的資源醒颖,例如請求兩個機架上的4個2vcpu,2GB的Container和4vcpu,2GB的Container,如果集群中沒有則需要從其他應(yīng)用程序搶占資源;
  4. 超細粒度的資源: 例如CPU性能要求,綁定CPU壳炎;
  5. 動態(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)度模型如下圖所示:

image

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ā)生的原因則完全是由于“最小資源量”這一概念;


image

資源調(diào)度器之Capacity Scheduler

Capacity Scheduler是Yahoo開發(fā)的多用戶調(diào)度器,它以隊列為單位拱镐,每個隊列可設(shè)定一定比例的資源最低保證和使用上限艘款,同時每個用戶也可以設(shè)定一定的資源使用上限以防止資源濫用。當一個隊列的資源有剩余時痢站,可暫時將剩余資源共享給其他隊列;
Capacity Scheduler特點:

  1. 容量保證:管理員可以為每個隊列設(shè)置資源的最低保證和使用上限磷箕,而所有提交到該隊列的應(yīng)用程序共享這些資源;
  2. 靈活性: 當一個隊列的資源有剩余時选酗,可暫時將剩余資源共享給其他隊列,一旦該隊列有閑的應(yīng)用程序提交阵难,則其他隊列釋放的資源會歸還該隊列;
  3. 多重租賃: 支持多用戶共享集群和多應(yīng)用程序同時運行;
  4. 安全性保證: 每個隊列都有嚴格的ACL列表規(guī)定他的訪問用戶;
  5. 動態(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表示信息如下圖所示:

image

Yarn采用了三級資源分配策略,當一個節(jié)點上有空閑資源的時候,它會依次選擇隊列肩狂,應(yīng)用程序,Container使用該資源,如下圖所示:

image

步驟一: 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的比較

image

參考:
《Hadoop技術(shù)內(nèi)幕 : 深入解析YARN架構(gòu)設(shè)計與實現(xiàn)原理》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末具壮,一起剝皮案震驚了整個濱河市准颓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棺妓,老刑警劉巖攘已,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怜跑,居然都是意外死亡样勃,警方通過查閱死者的電腦和手機吠勘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峡眶,“玉大人剧防,你說我怎么就攤上這事”栌#” “怎么了峭拘?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狮暑。 經(jīng)常有香客問我鸡挠,道長,這世上最難降的妖魔是什么搬男? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任拣展,我火速辦了婚禮,結(jié)果婚禮上缔逛,老公的妹妹穿的比我還像新娘备埃。我一直安慰自己,他們只是感情好译株,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布瓜喇。 她就那樣靜靜地躺著挺益,像睡著了一般歉糜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上望众,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天匪补,我揣著相機與錄音,去河邊找鬼烂翰。 笑死夯缺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的甘耿。 我是一名探鬼主播踊兜,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佳恬!你這毒婦竟也來了捏境?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤毁葱,失蹤者是張志新(化名)和其女友劉穎垫言,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倾剿,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡筷频,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凛捏。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡担忧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坯癣,到底是詐尸還是另有隱情涵妥,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布坡锡,位于F島的核電站蓬网,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹉勒。R本人自食惡果不足惜帆锋,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禽额。 院中可真熱鬧锯厢,春花似錦、人聲如沸脯倒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藻丢。三九已至剪撬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悠反,已是汗流浹背残黑。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斋否,地道東北人梨水。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像茵臭,于是被迫代替她去往敵國和親疫诽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容