目錄
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平臺中可以通過可視化方式對上述參數進行設置。如下圖所示: