Yarn 工做架構html
最近隨着集羣你們開始頻繁使用集羣,資源調度的問題愈加的凸顯出來。須要更加深刻的瞭解 yarn 資源調度的原理,以及到底在背後作了一些什麼事情。node
來看一下下面這張圖。linux
yarn 裏面有兩個大的角色,這個也很容易在 yarn 裏面的配置看到。算法
一個是 Resource Manager 相似於 Master 角色負責任務分配,他會往 Node Manager 分配一個 App Master。 而後 App Master 會向 Resource Manager 申請資源。這個時候 Resource Manager 會給這個任務開始分配 Container 用於實際處理這個任務。架構
這裏咱們能夠仔細看下這張圖。app
這裏左邊來了兩個須要計算調度的任務。咱們能夠認爲一個是 hive 表的 sqoop 同步任務,另一個是 hive 的 mapreduce 查詢任務。分佈式
Client 到 Resource Manager 這裏的線表明的是 Job Submission 任務提交。以後 ResourceMnagager 會爲任務分配 Application Master。ide
這個 Application Master 就是該任務的代理。 Application Master 會直接經過 Resource Request 向 ResourceManager 進行狀態彙報。 同時全部被 Application Master 分配的 Container 都會定時向 Application Master 上報 MapReduce Status 也就是任務的運行狀態。同時 Container 也會向 NodeManager 彙報。oop
下面咱們來看下在 Resource Manager 裏面包含了什麼ui
圖上的 1a 是負責任務調度。1b 是維護當前的任務的,好比當前提交的那些活兒。1c 是一個 rpc 服務,所作的工做就是響應 Node Manager.
正好我看的這個介紹的視頻穿插介紹了 spark on yarn cluster 的架構,順手貼個圖吧.
CDH 靜態動態資源分配
下面讓咱們來梳理一下 Yarn 資源調度的幾種模式
1. FIFO Scheduler 先到先得 誰先提交,先就優先得到更多的資源執行。
2. Capacity Scheduler 容器管理
3. Fair Scheduler 公平調度管理 前提:假設任務具備相同的優先級,平均分配資源。能夠指定任務權重,權重任務大的能夠得到更多的資源。之內存爲資源分配條件。
4. DRF 主導資源公平 和 Fair Scheduler 相比該資源調度將會在考慮內存的同時也考慮 CPU 需求做爲調度的條件。
一般默認 CDH 會設置 DRF 做爲默認的調度器。
因爲擔憂 CDH 和 社區版的會有不一樣下面一部份內容將重點參考 CDH 官方文檔。
咱們先從最上層談起
CDH 的 CM 提供了兩種方法去分配集羣資源給各個服務,分別是靜態分配和動態分配。
靜態資源分配使用了 linux 內核提供的 cgroups ,使用cgroups靜態分配資源能夠經過單個靜態服務池嚮導進行配置。您能夠按總資源的百分比分配服務,嚮導將配置cgroups。
另一種分配是動態資源分配。
動態資源池分配資源在 CM 裏面支持對 YARN 和 Impala 進行配置。
咱們能夠經過設置動態資源池來限制一些資源的使用。我看了一下文檔感受這一部分須要高亮的地方能夠提一下。
A scheduling rule defines when a configuration set is active. The configurations in the configuration set are propagated to the fair scheduler allocation file as required by the schedule. The updated files are stored in the YARN ResourceManager configuration directory /var/run/cloudera-scm-agent/process/nn-yarn-RESOURCEMANAGER on the host running the ResourceManager role. See Server and Client Configuration.
1. 配置的修改會保存在 yarn 的 ResourceManager 部署節點的 /var/run/cloudera-scm-agent/process/nn-yarn-RESOURCEMANAGER 目錄下。咱們能夠經過 ls -lst 找到最新配置。
2. 咱們能夠配置資源池爲父池,可是一旦被配置爲父池子就不能掛具體執行的任務了。具體的任務只能掛在子池子上。子池子上的資源策略要小於等於父池子的策略。若是超過的話以父池爲準。
下面我配置了一個動態資源池給咱們一個 spark 常駐服務使用。
其實看上去很簡單。
我這裏要解決的需求就是單獨隔離這一類任務,只須要設置這個池子,而後若是須要進行更精細的資源控制,只須要將這個池子設置成父池子,再設置相應的子池子就行了。
並且移動已經在執行任務的隊列方法也很是方便只須要使用命令
hadoop2.0及以上版本能夠經過下面命令 yarn application -movetoqueue application_1478676388082_963529 -queue root.etl
Steady Fair | ShareInstantaneous Fair Share 的區別
Yarn中的steady fair share值和Instaneous Fair Share值都表明了當前分配給這個隊列的最大資源值,也是隊列在任什麼時候候資源使用量不能夠超過的值 ,可是他們存在區別。
對於steady fair share,是一個靜態值,是Yarn根據每一個隊列的minShare、maxShare和weight的配置計算獲得的理論上應該分配給這個隊列的最大資源,它與這個隊列當前是否有app正在運行無關,只和咱們在fair-scheduler.xml中的配置有關。
而Instaneous fair share則不一樣,它是根據當前集羣中隊列的運行狀態的變化而實時變化的,即,若是一個隊列上沒有任何一個app在運行,即這個隊列是inactive隊列,那麼,這個隊列的instaneous fair share值是0,剩餘的active隊列會對集羣資源進行瓜分,顯然,若是集羣中有隊列從active變爲inactive,那麼剩餘這些隊列瓜分到的instaneous fair shared都會隨之變大,反之,若是有一個隊列從inactive變爲active,則剩餘每一個隊列的instaneous fair share會隨之變小,即instaneous fair share會變小。
參數介紹
最後我想以 yarn ui 界面上的一些參數解釋來結束這篇文章
正常咱們會看到本身執行的任務在 yarn 的管理界面長這個樣子。
Queue: 表明正在哪一個隊列裏面執行,若是是 CDH 的動態資源分配模式下會對應一個資源池的概念。
% of Queue: 佔資源池裏面多少資源百分比。
% of Cluster: 佔整個集羣資源的百分比。
schema 的界面會是這個樣子
FairShare: 表明最多能夠佔用的內存數量。
更多的細節就要看代碼了,好比各類個樣的調度器算法。本篇文章不會這麼深刻,不過以後有機會也會看一看。
---------------------------------參數調優----------------------------------
yarn.nodemanager.resource.memory-mb 調整每臺物理機器能夠被調度的內存資源 好比四個節點就會是 * 4 yarn.scheduler.maximum-allocation-mb 調整單個任務能夠分配的最大內存資源。通常這個 cloudera 推薦調整爲最大配置機器的可分配內存數 yarn.nodemanager.resource.cpu-vcores 調整每臺物理機器能夠被調度的 cpu 資源 好比四個節點就會是 * 4
更詳細的資源方面的調優建議參考
https://wiki.jrwang.me/cluster/cluster-yarn-conf.html
Reference:
https://www.youtube.com/watch?v=_QkKw82ge6g Hadoop內部原理:分佈式系統如何實現?存儲、計算和調度
https://www.cloudera.com/documentation/enterprise/6/6.0/topics/admin_rm.html Resource Management
https://blog.csdn.net/wisgood/article/details/39075883 Hadoop 設置任務執行的隊列以及優先級
https://note.youdao.com/share/?id=76b79bced3fcd4aec4327c8a20032ca7&type=note#/ wjh 的有道雲筆記
https://blog.csdn.net/qq_35440040/article/details/82620794 Yarn FairSheduler使用FairSharePolicy計算Fair Share的規則、原理和代碼實現
http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-memory-cpu-scheduling/ Hadoop YARN中內存和CPU資源的調度和隔離