Hadoop權威指南 第4章 關於YARN

QCDDG發表於2020-10-21


YARN(Yet Another Resource Negotiator)是hadoop的叢集資源管理系統。YARN被引入Hadoop2,最初是為了改善MapReduce的實現,但它具有足夠的額通用性,同樣可以支援其他的分散式計算模式。
在這裡插入圖片描述

圖:YARN應用
YARN提供請求和使用叢集資源的API,但這些API很少直接用於使用者程式碼。使用者程式碼中用的是分散式計算框架提供的更高層API,這些API簡歷在YARN之上且向使用者隱藏了資源管理細節。 還有一些應用時間裡在上圖所示框架之上,如Pig、Hive、Crunch都是執行在MapReduce、Spark、Tez之上的處理框架。

YARN執行機制

YARN通過兩類長期執行的守護程式提供自己的核心服務:

  1. 資源管理器:resource manager,管理叢集上資源的使用
  2. 節點管理器:node manager,執行在叢集所有節點上,能夠啟動和監控容器container

在這裡插入圖片描述

圖:YARN應用的執行機制
  1. 為了在YARN上執行一個應用,客戶端聯絡資源管理器,要求它執行一個application master程式。
  2. 資源管理器找到一個能夠在容器中啟動application master的節點管理器。
  3. application master一旦執行起來後能夠做些什麼依賴應用本身,可能是簡單的執行一個計算並返回結果,也可能如圖所示,項資源管理器請求更太多的容器。
  4. 請求新的容器後,就能夠執行一個分散式計算
    YARN不會為應用的各部分彼此通訊提供任何手段。

資源請求

YARN有一個靈活的資源請求模型,請求多個容器時,除了可以指定每個容器需要的計算資源數量(記憶體和cpu)還可以指定對容器的本地限制要求。
本地化可以確保計算儘可能的靠近資料,減少叢集頻寬資源,本地限制可用於申請位於指定節點或機架或叢集中任意位置的容器。
本地限制無法滿足時,要麼不分配資源,要麼選擇放鬆限制。
通常啟動一個容器用於處理map任務時,應用首先會向儲存該資料塊三個複本的節點或者儲存這些複本的機架申請一個節點,如果失敗,則申請叢集中的任意節點。
YARN應用可以在任意時刻提出資源申請,既可以在最開始提出所有的請求,也可不必一次性申請全部的資源。
Spark就採用了一次性申請的方式,在叢集中啟動固定數量的執行器。MapReduce採用的動態申請資源的方式,最開始先申請map任務容器,reduce任務容器的啟動在map任務完成過後啟動。

使用者作業之間的對映關係分類:

  1. 一個使用者作業對應一個應用,MapReduce採用的方式
  2. 作業的每個工作流或每個使用者會哈對應一個應用,容器可以在作業之間重用,並且有可能快取作業之間的中間資料。Spark採用的這種模式
  3. 多個使用者共享一個長期執行的應用。

YARN中的排程

排程選項

YARN中有三種排程器可用:

  1. FIFO排程器,將應用放置在一個佇列中,然後按照提交的順序執行應用,優點是簡單易懂,不需要額外配置,但是不適合共享叢集,大的應用會佔用叢集中所有資源,每個應用必須等待直到輪到自己執行在這裡插入圖片描述
    如圖所示,大的應用job1會佔用叢集中所有資源,job2必須等待直到輪到自己執行
  2. 容量排程器,有一個獨立的專門的任務佇列保證小作業已提交就能夠啟動在這裡插入圖片描述
    由於佇列容量是為小作業單獨保留,所以這種策略是以整個叢集利用率為代價的
  3. 公平排程器,不需要預留一定量的資源,因為排程器會在所有執行的作業之間動態平衡資源在這裡插入圖片描述
    當一個作業啟動時,它是唯一一個作業,而獲取叢集中的所有資源。當第二個作業啟動時,他被分配到叢集中一半的資源

容量排程器配置

容量排程器允許多個組織共享一個Hadoop叢集,每個組織分配到全部叢集資源的一部分,每個組織被配置一個專門的佇列,每個佇列被配置為可以使用一定的叢集資源。在一個佇列內部,使用FIFO排程策略對應用進行排程。當一個佇列中有多個作業,且資源不夠用時,有可能使用其他佇列的空閒資源。容器排程器不會通過強制中止進行搶佔容器。在這裡插入圖片描述

圖:佇列的層次結構

root下有兩個佇列prod和dev,分別佔40%和60%的容量,dev佇列進一步分成eng和science兩個容量相等的佇列
capacity-scheduler.xml

<?xml version="1.0"?>
<configuration>
    <property>
        <name>yarn.scheduler.capacity.root.queues</name>
        <value>prod,dev</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.queues</name>
        <value>eng,science</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.maxinum-capacity</name>
        <value>75</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.eng.capacity</name>
        <value>50</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.science.capacity</name>
        <value>50</value>
    </property>
</configuration>

其中dev最大容器設定為75%,因此即使prod佇列空閒,dev佇列也不會佔用全部的叢集資源。prod佇列即刻能夠使用的可用資源比例總是能夠達到25%。prod佇列可能會佔用全部的叢集資源。
將應用放到哪個佇列取決於應用本身。在MapReduce中,可以通過設定屬性mapreduce.job.queuename來指定要用到的佇列。

公平排程器配置

公平排程器旨在為所有執行的應用公平的分配資源。在這裡插入圖片描述

圖:使用者佇列間的公平共享

兩個使用者A和B,分別擁有自己的佇列。A啟動一個作業1,在B沒有需求時A會分配到全部的可用資源;當作業1在執行中時,B提交作業2,一段時間後,每個作業佔用一半的叢集資源。這是如果B提交作業3,那麼作業3和作業2共享資源,因此作業2和作業3個佔用四分之一的叢集資源,最終就是資源在使用者之間實現公平共享。

預設是使用容量排程器,如果使用公平排程器,需要將yarn-site.xml檔案中的yarn.resourcemanager.scheduler.class設定為公平排程器的完全限定名:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchdduler。

通過fair-scheduler.xml對公平排程器進行配置

<?xml version="1.0"?>
<allocations>
    <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
    
    <queue name="prod">
        <weight>40</weight>
        <schedulingPolicy>fifo</schedulingPolicy>
    </queue>
    
    <queue name="dev">
        <weight>60</weight>
        <queue name="eng" />
        <queue name="science" />
    </queue>
    
    <queuePlacementPllicy>
        <rule name="specified" create="false" />
        <rule name="primaryGroup" create="false" />
        <rule name="default" create="dev.eng" />
    </queuePlacementPllicy>
</allocations>

每個佇列可以有不同的排程策略。佇列的預設排程策略可以通過頂層元素defaultQueueSchedulingPolicy進行設定,預設使用公平排程。
公平排程器也支援佇列級別的FIFO策略,以及Dominant Resource Fairness策略。prod佇列使用了FIFO排程策略。
queuePlacementPllicy指定了一個應用應該放在哪個佇列中,會從第一條規則開始匹配,直到匹配成功。
公平排程器支援資源搶佔,允許排程器種植哪些佔用資源超過了其公平共享份額的佇列的容器。通過yarn.scheduler.fair.preemption設定為true開啟搶佔功能。

相關文章