Yarn 架構
- ResourceManager: 處理客戶端請求、啓動/監控 ApplicationMaster、監控 NodeManager、資源分配和調度
- NodeManager:單個節點上的資源管理,處理來自 ResourceManager 的命令、處理來自 ApplicationMaster 的命令
- ApplicationMaster:數據切分、爲應用程序申請資源,並分配給內部任務,任務監控與容錯
- Container:對任務運行環境的抽象,封裝了 CPU、內存等多維資源以及環境變量、啓動命令等任務運行的相關的信息
Yarn 運行機制
-
作業提交
1.1 Client 調用 job.waitForCompletion 方法,向整個集羣提交 MapReduce 作業
1.2 Client 向 RM 申請一個作業 Id
1.3 Rm 給 Client 返回該 job 資源的提交路徑和作業 id
1.4 Client 提交 jar 包
1.5 Client 提交資源後,向 RM 申請運行 MrAppMaster
-
作業初始化
2.1 當 RM 收到 Client 請求後,將該 job 添加到容量調度器中
2.2 某一個空閒的 NodeManager 領取到該 job
2.3 該 NodeManager 創建 Container,併產生 MRAppmaster
2.4 下載 Client 提交的資源到本地
-
任務分配
3.1 MrAppMaster 向 RM 申請運行多個 MapTask 任務資源
3.2 RM 將運行 MapTask 任務分配給另外兩個 NodeManager,NodeManager 分別領取任務並創建容器
-
任務運行
4.1 MR 向兩個接收到任務的 NodeManager 發送程序啓動腳本,這兩個 NodeManager 分別啓動 MapTask,MapTask 對數據分區排序。
4.2 MrAppMaster 等待所有 MapTask 運行完畢後,向 RM 申請容器,運行 ReduceTask
4.3 ReduceTask 向 MapTask 獲取相應分區的數據
4.4 程序運行完畢後,MR 會向 RM 申請註銷自己
-
進度和狀態更新
5.1 5.1YARN 中的任務將其進度和狀態返回給應用管理器,客戶端每秒(通過 mapreduce.client.progressmonitor.pollinterval 設置)嚮應用管理器請求進度更新,展示給用戶。
-
作業完成
6.1 除了嚮應用管理器請求作業進度外, 客戶端每 5 秒都會通過調用 waitForCompletion()來檢查作業是否完成。時間間隔可以通過 mapreduce.client.completion.pollinterval 來設置。作業完成之後,應用管理器和 Container 會清理工作狀態。作業的信息會被作業歷史服務器存儲以備之後用戶覈查.
Yarn 調度策略
Hadoop 作業調度器主要有三種:FIFO、Capacity Scheduler、Fair Scheduler。Hadoop2.9.2 默認的資源調度器是 Capacity Scheduler
- FIFO
先進先出調度器,任務執行按照任務到達的時間進行排序,先到的先執行。
- Capacity Scheduler(容量調度器)
Apache Hadoop 默認使用的調度策略。Capacity 調度器允許多個組織共享整個集羣,每個組織可以獲得集羣的一部分計算能力。通過爲每個組織分配專門的隊列,然後再爲每個隊列分配一定的集羣資源,這樣整個集羣就可以通過設置多個隊列的方式給多個組織提供服務了。除此之外,隊列內部又可以垂直劃分,這樣一個組織內部的多個成員就可以共享這個隊列資源了,在一個隊列內部,資源的調度是採用的 FIFO 策略。
- Fair Scheduler(公平調度器,CDH 版本的 hadoop 默認使用的調度器)
Fari Scheduler 的設計目標是爲所有的應用分配公平的資源,公平調度在也可以在多個隊列間工作。舉個例子,假設有兩個用戶 A 和 B,他們分別擁有一個隊列。當 A 啓動一個 job 而 B 沒有任務時,A 會獲得全部集羣資源;當 B 啓動一個 job 後,A 的 job 會繼續運行,不過一會兒後兩個任務會各自獲得一半的集羣資源。
如果此時 B 再啓動第二個 job 並且其他 job 還在運行,則它將會和 B 的第一個 job 共享 B 這個隊列的資源,也就是 B 的兩個 job,每個佔用 1/4 的集羣資源,而 A 的 job 仍然使用一半的資源,結果就是資源最終在兩個用戶之間平等的共享。
Yarn 多租戶資源隔離
場景:
Yarn 集羣資源設置 A、B 兩個隊列
- A 隊列設置佔用 70%資源主要用來運行常規的定時任務
- B 隊列設置佔用資源 30%主要運行臨時任務
- 兩個隊列間可相互資源共享,假如 A 隊列資源佔滿,B 隊列資源比較充裕,A 隊列可以使用 B 隊列的資源,使總體做到資源利用最大化
可以選擇 Fair Scheduler 調度策略
具體配置:
- yarn-site.xml
<!-- 指定我們的任務調度使用fairScheduler的調度方式 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSch
eduler</value>
<description>In case you do not want to use the default
scheduler</description>
</property>
- 在 hadoop 安裝目錄/etc/hadoop 下創建 fair-scheduler.xml 文件
<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
<allocations>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queuename="root">
<queuename="default">
<aclAdministerApps>*</aclAdministerApps>
<aclSubmitApps>*</aclSubmitApps>
<maxResources>9216mb,4vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<minResources>1024mb,1vcores</minResources>
<minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
<schedulingPolicy>fair</schedulingPolicy>
<weight>7</weight>
</queue>
<queuename="queue1">
<aclAdministerApps>*</aclAdministerApps>
<aclSubmitApps>*</aclSubmitApps>
<maxResources>4096mb,4vcores</maxResources>
<maxRunningApps>5</maxRunningApps>
<minResources>1024mb,1vcores</minResources>
<minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
<schedulingPolicy>fair</schedulingPolicy>
<weight>3</weight>
</queue>
</queue>
<queuePlacementPolicy>
<rulecreate="false"name="specified"/>
<rulecreate="true"name="default"/>
</queuePlacementPolicy>
</allocations>