1. 程式人生 > 實用技巧 >yarn 資源排程

yarn 資源排程

目錄

yarn 介紹

yarn主要就是為了排程資源,管理任務等。
YARN總體上是Master/Slave結構,主要由ResourceManager、NodeManager、 ApplicationMaster和Container等幾個元件構成。

  • ResourceManager(RM)
    負責處理客戶端請求,對各NM上的資源進行統一管理和排程。給ApplicationMaster分配空閒的Container 執行並監控其執行狀態。主要由兩個元件構成:排程器和應用程式管理器:
    1. 排程器(Scheduler):排程器僅根據各個應用程式的資源需求進行資源分配,而資源分配單位是Container。Shceduler不負責監控或者跟蹤應用程式的狀態。
    2. 應用程式管理器(Applications Manager):應用程式管理器負責管理整個系統中所有應用程式,包括應用程式提交、與排程器協商資源以啟動ApplicationMaster 、監控ApplicationMaster執行狀態並在失敗時重新啟動等,跟蹤分給的Container的進度、狀態也是其職責。
  • NodeManager (NM)
    NodeManager 是每個節點上的資源和工作管理員。它會定時地向ResourceManager彙報本節點上的資源使用情況和各個Container的執行狀態;同時會接收並處理來自ApplicationMaster 的Container 啟動/停止等請求。
  • ApplicationMaster (AM)
    使用者提交的應用程式均包含一個**ApplicationMaster **,負責應用的監控,跟蹤應用執行狀態,重啟失敗任務等。ApplicationMaster是應用框架,它負責向ResourceManager協調資源,並且與NodeManager協同工作完成Task的執行和監控。
  • Container
    Container是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等,當ApplicationMaster向ResourceManager申請資源時,ResourceManager為ApplicationMaster 返回的資源便是用Container 表示的。

yarn 工作流程

  • 1 client提交計算任務
  • 2 RM 收到任務後,進行許可權檢查,是否有能力處理該任務;
  • 3 Applications Manager會找一臺主機,啟動一個Container,在Container中啟動 ApplicationMaster;
  • 4 註冊APP Master
  • 5 申請計算資源
  • 6 以container形式回覆資源列表,讓目標主機分配資源
  • 7 執行計算任務(node02 開啟mapTask,reduceTask)
  • 8 彙報任務執行情況

yarn的排程器

yarn我們都知道主要是用於做資源排程,任務分配等功能的,那麼在hadoop當中,究竟使用什麼演算法來進行任務排程就需要我們關注了,hadoop支援好幾種任務的排程方式,不同的場景需要使用不同的任務排程器.

第一種排程器:FIFO Scheduler(佇列排程)

把任務按提交的順序排成一個佇列,這是一個先進先出佇列,在進行資源分配的時候,先給佇列中最頭上的任務進行分配資源,待最頭上任務需求滿足後再給下一個分配,以此類推。

FIFO Scheduler是最簡單也是最容易理解的排程器,也不需要任何配置,但它並不適用於共享叢集。大的任務可能會佔用所有叢集資源,這就導致其它任務被阻塞。

第二種排程器:Capacity Scheduler(**容量排程器**,**apache版本預設使用的排程器**)

Capacity 排程器允許多個組織共享整個叢集,每個組織可以獲得叢集的一部分計算能力。通過為每個組織分配專門的佇列,然後再為每個佇列分配一定的叢集資源,這樣整個叢集就可以通過設定多個佇列的方式給多個組織提供服務了。除此之外,佇列內部又可以垂直劃分,這樣一個組織內部的多個成員就可以共享這個佇列資源了,在一個佇列內部,資源的排程是採用的是先進先出(FIFO)策略。

第三種排程器:Fair Scheduler(**公平排程器**,**CDH版本的hadoop預設使用的排程器**)


(每個使用者平分)
Fair排程器的設計目標是為所有的應用分配公平的資源(對公平的定義可以通過引數來設定)。公平排程在也可以在多個佇列間工作。舉個例子,假設有兩個使用者A和B,他們分別擁有一個佇列。當A啟動一個job而B沒有任務時,A會獲得全部叢集資源;當B啟動一個job後,A的job會繼續執行,不過一會兒之後兩個任務會各自獲得一半的叢集資源。如果此時B再啟動第二個job並且其它job還在執行,則它將會和B的第一個job共享B這個佇列的資源,也就是B的兩個job會用於四分之一的叢集資源,而A的job仍然用於叢集一半的資源,結果就是資源最終在兩個使用者之間平等的共享

使用哪種排程器取決於yarn-site.xml當中的

yarn.resourcemanager.scheduler.class 這個屬性的配置

關於yarn常用引數設定

處理器數量 :虛擬的CPU顆數。

每個處理器的核心數量:虛擬的CPU核心數。

處理器核心總數:處理器核心總數 = 處理器數量 * 每個處理器的核心數量。
注:一個CPU有多個核心(單核/雙核/四核/六核/八核),而一個核心一般對應一個執行緒,但通過Intel的超執行緒技術,一個核心可以對應兩個執行緒,即可以同時執行兩個執行緒,並行處理兩個任務。

設定container分配最小記憶體

yarn.scheduler.minimum-allocation-mb 1024 給應用程式container分配的最小記憶體為1G

設定container分配最大記憶體

yarn.scheduler.maximum-allocation-mb 8192 給應用程式container分配的最大記憶體

設定每個container的最小虛擬核心個數

yarn.scheduler.minimum-allocation-vcores 1 每個container預設給分配的最小的虛擬核心個數

設定每個container的最大虛擬核心個數

yarn.scheduler.maximum-allocation-vcores 32 每個container可以分配的最大的虛擬核心的個數

設定NodeManager可以分配的記憶體大小

yarn.nodemanager.resource.memory-mb 8192 nodemanager可以分配的最大記憶體大小,預設8192Mb

定義每臺機器的記憶體使用大小

yarn.nodemanager.resource.memory-mb 8192

定義交換區空間可以使用的大小

交換區空間就是講一塊硬碟拿出來做記憶體使用,這裡指定的是nodemanager的2.1倍

yarn.nodemanager.vmem-pmem-ratio 2.1