YARN——標籤排程

語言: CN / TW / HK

【簡介】


hadoop2.7.2開始,yarn在容量排程器的基礎上增加了標籤排程功能,使用該功能的一個典型場景是:某個任務需要用到gpu資源,而gpu並非在每個節點上都有,通過對節點設定標籤,可以使作業任務正確排程到含gpu資源的節點上,確保作業任務正確執行。


本文主要講解如何正確配置使用標籤排程,至於標籤排程的一些基本概念可以自行從官網上檢視。


【配置使用】


  • 啟用標籤功能

要使用標籤排程,首先需要啟用標籤功能,也就是在rm的配置檔案中增加如下配置:

<property>  <name>yarn.node-labels.enabled</name>  <value>true</value></property><property>  <name>yarn.node-labels.fs-store.root-dir</name>  <value>hdfs:///yarn/node-labels</value></property>


配置項yarn.node-labels.enabled表示是否啟用標籤功能。


yarn.node-labels.fs-store.dir表示標籤的儲存位置,可以是本地檔案,也可以是hdfs上的儲存路徑(檔案目錄會自動進行建立)


  • 在叢集中新增標籤

通過修改配置啟用標籤功能後,接下來就是向叢集中新增一些標籤,例如使用如下命令新增一個gpu的標籤:

yarn rmadmin -addToClusterNodeLabels "gpu(exclusive=true)"


exclusive表示是否獨佔,具體可以理解為,當該標籤分割槽下的節點有空閒資源時,是否可以共享給default分割槽的任務使用。


true表示獨佔,即不共享,資源僅分配給具有該標籤的任務使用。

false表示非獨佔,即可以共享。


新增標籤前,rm的介面上,可以看到只有DEFAULT標籤(如下圖所示)



新增標籤後,rm的介面上,就可以看到對應的標籤資訊了。



另外,從上圖可以看出來,gpu,hncscwc兩個標籤對應的分割槽中都還沒有活躍的NM節點。


  • NM節點關聯標籤

完成標籤的新增後,接下來就是給指定的節點關聯到不同的標籤上,也就是將叢集的節點按標籤劃分成不同的節點分割槽。


yarn rmadmin -replaceLabelsOnNode "192.168.3.51:9100=gpu"


執行上面的命令後,再來看看rm的介面,可以看到gpu的標籤,有了一個活躍的節點,而DEFAULT標籤中則少了一個活躍節點。



從NM節點列表的介面中,也可以看到該節點有了對應的標籤資訊。



同時,佇列的介面中,也多出了對應的標籤資訊,所有佇列均會出現在所有標籤中。



但是,gpu,hncscwc兩個標籤下,所有佇列的容量均為0,即佇列還未設定對應標籤的使用容量。



  • 設定佇列可訪問的標籤與容量

在配置檔案(capacity-scheduler.xml)中,配置每個佇列可以訪問的標籤,以及每個標籤資源的使用容量,例如按如下進行配置:


<!-- spurs佇列設定可訪問的標籤 --><property>  <name>yarn.scheduler.capacity.root.spurs.accessible-node-labels</name>  <value>hncscwc,gpu</value></property><!-- net佇列設定可訪問的標籤 --><property>  <name>yarn.scheduler.capacity.root.net.accessible-node-labels</name>  <value>hncscwc,gpu</value></property><!-- spurs佇列可訪問gpu標籤中的資源百分比 --><property>  <name>yarn.scheduler.capacity.root.spurs.accessible-node-labels.gpu.capacity</name>  <value>30</value></property><!-- net佇列可訪問gpu標籤中的資源百分比 --><property>  <name>yarn.scheduler.capacity.root.net.accessible-node-labels.gpu.capacity</name>  <value>70</value></property><!-- spurs佇列可訪問hncscwc標籤中的資源百分比 --><property>  <name>yarn.scheduler.capacity.root.spurs.accessible-node-labels.hncscwc.capacity</name>  <value>30</value></property><!-- net佇列可訪問gpu標籤中的資源百分比 --><property>  <name>yarn.scheduler.capacity.root.net.accessible-node-labels.hncscwc.capacity</name>  <value>70</value></property>


配置完成後,通過命令重新整理佇列使配置生效,在介面中可以看到如下資訊:



從上圖可以看到,net佇列可以訪問gpu,hncscwc兩個標籤的資源,並且在gpu標籤中,容量配置為70%。


但是絕對可使用容量(Absolute Configured Capacity)卻是0,為什麼會這樣呢?


回顧上一篇文章中提到的,佇列的容量計算時是按係數乘以父佇列可以訪問的容量,net佇列的父佇列為root,而root卻沒有對該標籤的容量進行設定,導致出現該問題。


在配置檔案中再增加如下配置:


<property>  <name>yarn.scheduler.capacity.root.accessible-node-labels.gpu.capacity</name>  <value>100</value></property><property>  <name>yarn.scheduler.capacity.root.accessible-node-labels.hncscwc.capacity</name>  <value>60</value></property>


重新整理後,可以看到net佇列的絕對可使用容量已經不再是0了。



這裡,有人可能會有這樣的疑問?

既然root佇列也需要設定不同標籤的容量,其子佇列才能真正配置到資源,那麼root佇列是否也和其他佇列一樣需要配置可訪問的標籤呢?


剛開始時,我也有這樣的疑問,帶著問題,查看了相關原始碼,發現root佇列不需要配置可訪問的標籤,預設就是"*",即可以訪問所有的標籤,但容量還是要配置。(具體為什麼,還沒有想清楚,覺得root佇列既然預設可以訪問所有標籤,其容量也應當預設為100才對)


  • 提交任務

所有配置都完成後,接下來就是提交任務了,由於有的佇列可以同時訪問多個標籤,也就是可以使用多個標籤的節點資源,那麼具體某個任務應該分配到哪個節點上去,這就是提交任務時需要自行指定標籤了。


例如,提交MR任務時,通過如下引數

"-Dmapreduce.job.queueName=net -Dmapreduce.job.node-label-expression=gpu"

指定該任務提交到net佇列上,並且指定需要分配到gpu標籤對應的節點上。


如果任務提交時沒有指定node-label-expression,那麼就使用佇列的預設標籤。


通過如下配置可以指定佇列的預設標籤

<!-- 佇列net設定預設標籤為gpu --><property>  <name>yarn.scheduler.capacity.root.net.default-node-label-expression</name>  <value>gpu</value></property>


另外,標籤的配置方式可以通過yarn.node-labels.configuration-type來配置,可選值包括centralizeddelegated-centralized、distributed。


centralized為預設值,表示NM節點與標籤的對映關係通過rm的管理命令(也就是上介紹的命令方式)、rest介面、rpc請求來進行統一控制。


delegated-centralized表示由rm內部決定,通常是自行編寫類,繼承RMNodeLabelsMappingProvider,來實現節點與標籤的關聯關係。


distributed表示nm自行配置並上報標籤資訊。


有興趣的小夥伴,可以自行研究下如何配置。


好了,本文就介紹到這裡,原創不易,點贊,在看,分享是最好的支援, 我會持續輸出乾貨的,謝謝~



本文分享自微信公眾號 - hncscwc(gh_383bc7486c1a)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。