YARN NodeLabel功能以及在EMR彈性伸縮中的應用

YARN Node Label功能最早是在Hadoop 2.6版本中引入,在後續版本中有更多的功能完善。到了Hadoop 2.8.x版本之後,該功能已經比較完整,可以滿足日常使用。在本文中,我們需要將Node Label功能應用在EMR彈性伸縮場景中。

其實Node Label特性更準確的叫法是Node Partition,也就是說通過label把YARN集羣中的節點分組,每個節點擁有一個label,通過調度器的配置,將作業Task調度到指定的節點中,如果節點沒有配置Label,那麼這個節點屬於Label爲DEFAULT的Partition。Hadoop 3.2之後加入的Node Attribute功能是更加靈活的方案,可以方便的給各個節點打上OS/kernel version/CPU architecture/JDK version等標籤,但這個功能在本文中就不展開了。更多關於Node Label的信息請參考Hadoop YARN PMC Wangda的文章

配置

首先需要給YARN服務打開NodeLabel功能,yarn-site.xml需要增加配置:

  1. yarn.node-labels.enabled -> true
  2. yarn.node-labels.fs-store.root-dir -> /yarn/node-label

保存後需要重啓YARN ResourceManager。

節點的Node Label

EMR集羣的worker node有兩類節點,分別是core節點(除了NodeManager之外還運行HDFS和HBase等存儲服務進程)和task節點(只運行NodeManager之類的計算服務),我們首先增加兩個node label

yarn rmadmin -addToClusterNodeLabels "core(exclusive=false),task(exclusive=false)"

exclusive=false意思是這個Label的資源可以共享給申請DEFAULT資源的作業。

然後給各個節點打上標籤(用你的機器名字替代 emr-worker-*.cluster-105364):

yarn rmadmin -replaceLabelsOnNode \
  "emr-worker-1.cluster-105364=core emr-worker-2.cluster-105364=core emr-worker-3.cluster-105364=task"

Scheduler的配置

目前只有YARN Capacity Scheduler支持NodeLabel功能,我們以他爲例,而且假設一個最簡單的場景,集羣內只有一個queue(default)。

在配置node label相關的信息之前,capacity-scheduler.xml 包含如下內容:

  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>100</value>
  </property>

新增Node Label相關配置:

  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels</name>
    <value>core,task</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.core.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.task.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
    <value>core,task</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.accessible-node-labels.core.capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.accessible-node-labels.task.capacity</name>
    <value>100</value>
  </property>

上述配置的意思是:

  1. 對於Label爲core的資源,default queue佔用100%的資源
  2. 對於Label爲task的資源,default queue佔用100%的資源

保存配置之後,需要刷新YARN Scheduler queue。

作業提交

在彈性伸縮場景下,task節點可能隨時被停止,所以如果一個長時間運行的作業的application master(AM)被運行在Task節點上,當節點停止後AM就退出了,可能會造成作業失敗。所以,比較好的策略是AM只啓動在Core節點上。

如果集羣開啓了Node Label功能,我們可以通過配置作業的方式,將AM啓動在Core節點上。本文中只介紹MapReduce和Spark兩類作業

MapReduce作業

提交作業如下:

hadoop jar hadoop-mapreduce-examples-2.8.5.jar pi \
    -Dmapreduce.job.am.node-label-expression=core \
    10 100000000

mapreduce.job.am.node-label-expression=core參數指明瞭MapReduce AM申請core類型資源,所以AM一定會啓動在Core節點上。同時,因爲沒有指定普通Task運行的資源(也就是申請了DEFAULT),所以普通Task可以同時運行在Core和Task節點上(exclusive=false)。

如果要希望MapReduce Map或Reduce task只運行在Task節點上,可以在提交參數上指定:

hadoop jar hadoop-mapreduce-examples-2.8.5.jar pi \
    -Dmapreduce.job.am.node-label-expression=core \
    -Dmapreduce.job.node-label-expression=task \
    100 100000000

另外,還有mapreduce.map.node-label-expression和mapreduce.reduce.node-label-expression等參數可配置。

Spark作業

類似於MapReduce Job,我們可以指定spark.yarn.am.nodeLabelExpression 和 spark.yarn.executor.nodeLabelExpression 將作業提交到不同的節點上。下面這個例子是將Spark AM啓動在Core節點上:

spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn --deploy-mode cluster \
    --conf spark.yarn.am.nodeLabelExpression=core \
    spark-examples_2.11-2.3.2.jar 10

參考資料

  1. YARN Node Labels: Label-based scheduling and resource isolation
  2. YARN Node Labels
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章