Yarn的資源調度原理詳解

目錄

1 Yarn的相關定義

2 Yarn的運行機制

3 Yarn的資源調度原理

4 Yarn資源管理器參數調優詳解


1 Yarn的相關定義

    Yarn 是一個資源調度平臺,負責爲運算程序提供服務器運算資源,相當於一個分佈式的操作系統,而各類運算程序則相當於運行於操作系統之上的應用程序。

   YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等組件構成。

   具體各個組件之間的含義如下圖所示:

2 Yarn的運行機制

   YARN 的運行機制如下圖所示:

   yarn的工作原理:

工作機制詳解
(0)Mr 程序提交到客戶端所在的節點。
(1)Yarnrunner 向 Resourcemanager 申請一個 Application。
(2)rm將該應用程序的資源路徑返回給 yarnrunner。
(3)該程序將運行所需資源提交到 HDFS 上。
(4)程序資源提交完畢後,申請運行 mrAppMaster。
(5)RM 將用戶的請求初始化成一個 task。
(6)其中一個 NodeManager 領取到 task 任務。
(7)該 NodeManager 創建容器 Container,併產生 MRAppmaster。
(8)Container 從 HDFS 上拷貝資源到本地。
(9)MRAppmaster 向 RM 申請運行 maptask 資源。
(10)RM 將運行 maptask 任務分配給另外兩個 NodeManager,另兩個 NodeManager 分
別領取任務並創建容器。
(11)MR 向兩個接收到任務的 NodeManager 發送程序啓動腳本,這兩個 NodeManager
分別啓動 maptask,maptask 對數據分區排序。
(12)MrAppMaster 等待所有 maptask 運行完畢後,向 RM 申請容器,運行 reduce task。
(13)reduce task 向 maptask 獲取相應分區的數據。
(14)程序運行完畢後,MR 會向 RM 申請註銷自己。

以mr作業提交的資源調度進一步說明如下:

 (1)作業提交

  •          第 0 步:client 調用 job.waitForCompletion 方法,向整個集羣提交 MapReduce 作業。
  •          第 1 步:client 向 RM 申請一個作業 id。
  •          第 2 步:RM 給 client 返回該 job 資源的提交路徑和作業 id。
  •          第 3 步:client 提交 jar 包、切片信息和配置文件到指定的資源提交路徑。
  •          第 4 步:client 提交完資源後,向 RM 申請運行 MrAppMaster。

(2)作業初始化

  •         第 5 步:當 RM 收到 client 的請求後,將該 job 添加到容量調度器中。
  •         第 6 步:某一個空閒的 NM 領取到該 job。
  •         第 7 步:該 NM 創建 Container,併產生 MRAppmaster。
  •         第 8 步:下載 client 提交的資源到本地。

(3)任務分配

  •         第 9 步:MrAppMaster 向 RM 申請運行多個 maptask 任務資源。
  •         第 10 步:RM 將運行 maptask 任務分配給另外兩個 NodeManager,另兩個 NodeManager分別領取任務並創建容器。

(4)任務運行

  •         第 11 步:MR 向兩個接收到任務的 NodeManager 發送程序啓動腳本,這兩個NodeManager 分別啓動 maptask,maptask 對數據分區排序。
  •        第12步:MrAppMaster等待所有maptask運行完畢後,向RM申請容器,運行reduce task。
  •        第 13 步:reduce task 向 maptask 獲取相應分區的數據。
  •        第 14 步:程序運行完畢後,MR 會向 RM 申請註銷自己。

(5)進度和狀態更新

YARN 中的任務將其進度和狀態(包括 counter)返回給應用管理器, 客戶端每秒(通過

mapreduce.client.progressmonitor.pollinterval 設置)嚮應用管理器請求進度更新, 展示給用戶。

(6)作業完成
        除了嚮應用管理器請求作業進度外, 客戶端每 5 分鐘都會通過調用 waitForCompletion()來檢查作業是否完成。時間間隔可以通過 mapreduce.client.completion.pollinterval 來設置。作業完成之後, 應用管理器和 container 會清理工作狀態。作業的信息會被作業歷史服務器存儲以備之後用戶覈查。

 小結:  YARN只負責程序運行所需要資源的分配回收等調度任務,和MapReduce程序沒有什麼耦合。所以許許多多的其他的程序也可以在YARN上運行,比如說Spark,Storm等。yarn並不清楚用戶提交的程序的運行機制,yarn只提供運算資源的調度(用戶程序向yarn申請資源,yarn就負責分配資源),yarn中的主管角色叫ResourceManager,yarn中具體提供運算資源的角色叫NodeManager,這樣一來,yarn其實就與運行的用戶程序完全解耦,就意味着yarn上可以運行各種類型的分佈式運算程序(mapreduce只是其中的一種),比如mapreduce、storm程序,spark程序等,所以,spark、storm等運算框架都可以整合在yarn上運行,只要他們各自的框架中有符合yarn規範的資源請求機制即可,這樣Yarn就成爲一個通用的資源調度平臺,從此,企業中以前存在的各種運算集羣都可以整合在一個物理集羣上,提高資源利用率,方便數據共享。

3 Yarn的資源調度原理

目前,Hadoop作業調度器主要有三種:FIFO、Capacity Scheduler和Fair Scheduler。Hadoop2.7.2默認的資源調度器是Capacity Scheduler。

具體設置詳見:yarn-default.xml文件

<property>
    <description>The class to use as the resource scheduler.</description>
    <name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
  • 1.先進先出調度器(FIFO) 

  • 2.容量調度器(Capacity Scheduler) 

  •  3.公平調度器(Fair Scheduler)

4 Yarn資源管理器參數調優詳解

調優的本質是針對container來講的,因爲任務是在Container中運行的,往往是對容器中的核數、內存等進行配置

CPU資源的調度

在yarn中,一個物理core等價於兩個vcore,這個在CDH版本的hadoop中有一個參數控制(不要輕易調)
 (1)yarn.nodemanager.resource.cpu-vcores
    可爲Container分配的容器數量,這個參數在Resource Scheduler爲Container分配資源時可以用到。
如果它的值被設置爲-1,且參數yarn.nodemanager.resource.detect-hardware-capabilities的值爲
true,則不限制yarn使用CPU的數量,也可以設置爲8
(2)yarn.nodemanager.resource.detect-hardware-capabilities
    是否自動檢測節點的CPU和內存 默認爲false
(3)yarn.scheduler.minimum-allocation-vcores               
    爲每個Container分配的最少的vcore,小於這個參數設定的值則會拋出異常 默認爲1
(4)yarn.scheduler.maximum-allocation-vcores           
    爲每個Container分配的最多的vcore,大於這個參數設定的值則會拋出異常 默認爲4(生產調)

Memory資源的調優

(1) NM佔用機器的內存大小,單位MB   可設置爲50*1024 (生產可根據自己配置調)

yarn.nodemanager.resource.memory-mb     


(2)Container包含的最小內存,單位MB  可設置1024(生產可根據自己配置調)

yarn.scheduler.minimum-allocation-mb        

(3)Container包含的最大內存,單位MB  可設置8192(生產調)

yarn.scheduler.maximum-allocation-mb

隨着任務的運行,計算越來越大,任務消耗的資源越來越多,Container包含的內存也應該逐漸增加,在yarn中有一個參數可以設置每次內存加大的額度(yarn.scheduler.maximum-allocation-mb),當內存達到參數設置的最大內存還不夠時,任務會被yarn殺掉.

(4) Container內存不夠用時一次性加多少內存 單位MB 可設置2048

yarn.scheduler.increment-allocation-mb  

(5)容器是否會執行物理內存限制     默認爲True
        執行物理內存限制時,當Container達到最大物理內存限制時,該參數爲True時,會殺死任務

yarn.nodemanager.pmem-check-enabled 

(6)容器是否會執行虛擬內存限制    默認爲True
         執行虛擬限制時,當Container達到最大物理虛擬限制時,該參數爲True時,會殺死任務 

yarn.nodemanager.vmem-check-enabled 

 (7) 使用虛擬內存和物理內存的比值 默認爲2.1

yarn.nodemanager.vmem-pmem-ratio

  虛擬內存調優

  •     vm.swappiness 的值介於0到100之間
  •     swappiness=0的時候表示最大限度使用物理內存,然後纔是swap空間。
  •     swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間裏面。        
  •     linux的基本默認設置爲60。
  •     當任務處於高度計算時,不允許慢,允許掛掉後通過各種形式重啓任務,這時候將使用虛擬內存的積極性調低     vm.swappiness 的值可設置較大。當任務在一般計算時,可以慢,不允許掛,這時候將使用虛擬內存的積極性調高 。

 生產上一般允許慢不允許掛,然後vm.swappiness設置爲10。

[root@bigdata3 ~]# cat /proc/sys/vm/swappiness
60
也就是說,你的內存在使用到100-60=40%的時候,就開始會使用虛擬內存。
 
臨時調整(重啓失效):
    [root@bigdata3 ~]# sysctl vm.swappiness=10
    vm.swappiness = 10
    [root@timeserver ~]# cat /proc/sys/vm/swappiness
    10
 
永久調整,先完成臨時調整,再執行以下操作:
    [root@bigdata3 ~]# vi /etc/sysctl.conf
    # Controls the maximum number of shared memory segments, in pages
    在“kernel.shmall = 4294967296”後加上
    “vm.swappiness=10”
 
    [root@bigdata3 ~]# sysctl -p
    vm.swappiness = 10

在Ambarri平臺中可以通過可視化方式對上述參數進行設置。如下圖所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章