Node Labels特性使用
本文為您介紹YARN Node Labels特性、使用方式和常見問題。
基本介紹
YARN Node Labels特性支持將YARN NodeManager節(jié)點進行分區(qū)管理。因為一個節(jié)點只能設(shè)置屬于某一個Node Label,所以可以使用 Node Label將整個YARN集群劃分為不相交的節(jié)點集合。默認節(jié)點屬于DEFAULT分區(qū)(partition=""
,空字符串)。
分區(qū)又可以配置為兩類:
exclusive分區(qū):只允許請求和該分區(qū)匹配的容器調(diào)度到該分區(qū)的節(jié)點上。
non-exclusive分區(qū):除了分配該分區(qū)容器請求外,還允許在有空閑資源時將請求為DEFAULT分區(qū)的容器調(diào)度上來(或請求未特殊制定分區(qū))。
目前只有Capacity Scheduler調(diào)度器支持Node Labels分區(qū)調(diào)度,您可以通過調(diào)度器配置或者計算引擎node-label-expression參數(shù)讓隊列上的任務(wù)容器調(diào)度到隊列可訪問的分區(qū)上。
更詳細的Node Labels特性說明,請參見YARN Node Labels。
使用限制
EMR-5.11.1之前版本和EMR-3.45.1之前版本,且
yarn-site.xml
配置文件中yarn.node-labels.configuration-type
配置項值為centralized時,可以按照本文檔進行配置。EMR-5.11.1及之后版本、EMR-3.45.1及之后版本支持在EMR控制臺管理YARN分區(qū),具體操作請參見EMR控制臺管理YARN分區(qū)。
使用方式
在控制臺配置開啟Node Labels特性
在EMR控制臺YARN服務(wù)配置頁面的yarn-site.xml頁簽中,添加以下配置項,然后保存并重啟ResourceManager組件生效。
Key | Value | 說明 |
yarn.node-labels.enabled | true | 特性總開關(guān)。 |
yarn.node-labels.fs-store.root-dir | /tmp/node-labels | 默認centralized配置模式下node label,信息存儲位置可自行規(guī)劃。 |
這里只介紹Node Labels配置節(jié)點映射最方便的centralized模式便于理解工作原理,EMR-5.11.1及之后版本和EMR-3.45.1及之后版本已經(jīng)默認使用
yarn.node-labels.configuration-type=distributed
模式,無需使用本文提供的手動添加命令,支持在EMR控制臺管理YARN分區(qū),具體操作請參見EMR控制臺管理YARN分區(qū)。如果有其他需求請參見Hadoop社區(qū)文檔。如果在配置yarn.node-labels.fs-store.root-dir時直接使用路徑配置而不是URL,則默認使用
fs.defaultFS
配置的默認文件系統(tǒng),配置等價于${fs.defaultFS}/tmp/node-labels
。EMR中通常為分布式的HDFS。
命令添加相關(guān)Node Labels分區(qū)并建立節(jié)點映射
如果是需要自動指定彈性節(jié)點組擴容節(jié)點的NodeManager分區(qū),則需要在創(chuàng)建分區(qū)后,將replaceLabelsOnNode
運維命令添加到對應(yīng)節(jié)點組范圍的引導(dǎo)操作腳本中,在組件啟動后執(zhí)行。
命令示例如下。
# 使用YARN默認管理員hadoop賬戶執(zhí)行
sudo su - hadoop
# 添加分區(qū)
yarn rmadmin -addToClusterNodeLabels "DEMO"
yarn rmadmin -addToClusterNodeLabels "CORE"
# 列出YARN節(jié)點列表
yarn node -list
# 配置指定節(jié)點分區(qū)映射
yarn rmadmin -replaceLabelsOnNode "core-1-1.c-XXX.cn-hangzhou.emr.aliyuncs.com=DEMO"
yarn rmadmin -replaceLabelsOnNode "core-1-2.c-XXX.cn-hangzhou.emr.aliyuncs.com=DEMO"
執(zhí)行成功后,可以在ResourceManager Web UI驗證結(jié)果。
Nodes頁面
Node Labels頁面
CapacityScheduler配置隊列的可訪問分區(qū)、作業(yè)使用的分區(qū)
使用CapacityScheduler:確保yarn-site.xml文件配置中參數(shù)yarn.resourcemanager.scheduler.class的值為org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler。
在capacity-scheduler.xml中使用如下配置項,配置隊列可訪問的分區(qū)和容量,<queue-path>
替換為配置隊列,<label>
替換為配置分區(qū)(DEFAULT分區(qū)直接用常規(guī)的capacity或maximum-capacity配置即可)。
配置項 | 值 | 說明 |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels | 逗號分割的分區(qū)列表。 | 指定隊列的可訪問分區(qū)列表。 |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity | 值規(guī)則可參考yarn.scheduler.capacity.<queue-path>.capacity | 指定隊列在指定可訪問分區(qū)的資源容量。 重要 必須配置其所有祖先隊列的容量才能生效。 |
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity | 值規(guī)則可參考yarn.scheduler.capacity.<queue-path>.maximum-capacity,默認值為100。 | 指定隊列在指定可訪問分區(qū)的可超用的最大資源容量。 |
yarn.scheduler.capacity.<queue-path>.default-node-label-expression | 分區(qū)名,默認為空字符串代表DEFAULT分區(qū)。 | 指定隊列所提交作業(yè)中沒有特別指定分區(qū)的容器請求所使用的默認分區(qū)。 |
必須配置其所有祖先隊列的相同分區(qū)容量才能使指定隊列的實際資源量大于0,原因是包括root節(jié)點在內(nèi)的
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity
的默認值為0,所以必須配置yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity=100
所有的子隊列這個分區(qū)的容量才有可能不為0(理論上只要大于0即可,但是配置小于100導(dǎo)致子隊列推算的實際capacity變少了,沒什么意義);如果目標(biāo)隊列的祖先隊列capacity 配置缺失使用默認值 0,實際推算出來該隊列在此分區(qū)的實際capacity還是為0。當(dāng)
yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity
配置大于0后,和常規(guī)的yarn.scheduler.capacity.<queue-path>.capacity
規(guī)則一樣,要求直接子隊列的相同分區(qū)capacity之和為100。添加配置樣例如下。
<configuration> <!-- 在XML中Node Label相關(guān)新增配置項 --> <property> <!-- 配置default隊列可訪問DEMO分區(qū),必須 --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name> <value>DEMO</value> </property> <property> <!-- 配置default隊列所有祖先隊列DEMO分區(qū)容量,必須 --> <name>yarn.scheduler.capacity.root.accessible-node-labels.DEMO.capacity</name> <value>100</value> </property> <property> <!-- 配置default隊列在DEMO分區(qū)容量,必須 --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.capacity</name> <value>100</value> </property> <property> <!-- 配置default隊列在DEMO分區(qū)最大容量,可選,默認為100 --> <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.maximum-capacity</name> <value>100</value> </property> <property> <!-- 配置default隊列作業(yè)容器請求默認提交分區(qū),可選,默認為DEFAULT分區(qū)"" --> <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name> <value>DEMO</value> </property> <configuration>
完成編輯保存后,在YARN狀態(tài)頁面使用ResourceManager組件refreshQueues操作熱更新調(diào)度器隊列配置,在控制臺上觀察任務(wù)是否成功。成功后使用ResourceManager Web UI驗證結(jié)果。
除了調(diào)度器隊列默認分區(qū)配置,計算引擎也都基本支持Node Labels特性(Tez除外),引擎提交程序Node Labels相關(guān)參數(shù)不做贅述。
引擎 | 配置項 | 說明 |
MapReduce | mapreduce.job.node-label-expression | 作業(yè)所有容器默認使用的節(jié)點分區(qū)。 |
mapreduce.job.am.node-label-expression | ApplicationMaster使用的節(jié)點分區(qū)。 | |
mapreduce.map.node-label-expression | map子任務(wù)使用的節(jié)點分區(qū)。 | |
mapreduce.reduce.node-label-expression | reduce子任務(wù)使用的節(jié)點分區(qū)。 | |
Spark | spark.yarn.am.nodeLabelExpression | ApplicationMaster使用的節(jié)點分區(qū)。 |
spark.yarn.executor.nodeLabelExpression | Executor使用的節(jié)點分區(qū)。 | |
Flink | yarn.application.node-label | 作業(yè)所有容器默認使用的節(jié)點分區(qū) |
yarn.taskmanager.node-label | TaskManager使用的節(jié)點分區(qū),F(xiàn)link版本1.15.0開始支持,對應(yīng)EMR-3.44.0(3x系列)、EMR-5.10.0 (5x系列)。 |
常見問題
高可用集群必須將centralized模式Node Labels數(shù)據(jù)存儲在分布式文件系統(tǒng)中?
在高可用集群中,ResourceManager在多個節(jié)點上進行部署。開源Hadoop默認存儲Node Labels數(shù)據(jù)在本地tmp目錄file:///tmp/hadoop-yarn-${user}/node-labels/
。主備切換后,新的Active節(jié)點無法讀到本地存儲的Node Labels信息,所以必須將yarn.node-labels.fs-store.root-dir
配置為分布式存儲路徑,例如/tmp/node-labels
或者${fs.defaultFS}/tmp/node-labels
(EMR Hadoop默認文件系統(tǒng)為分布式HDFS,詳情請參見使用方式)。
自定義的分布式路徑必須確保文件系統(tǒng)服務(wù)正常且hadoop用戶能正常讀寫訪問,否則ResourceManager會啟動失敗。
添加節(jié)點分區(qū)映射時為什么不指定NodeManager端口?
EMR集群一個節(jié)點上最多只有一個NodeManager進程,所以指定端口沒有太大的意義。如果因為不了解導(dǎo)致寫錯端口,或者配置端口為隨機的情況下,帶端口執(zhí)行replaceLabelsOnNode不能正確建立節(jié)點分區(qū)映射。您可以使用命令yarn node -list -showDetails
查看節(jié)點當(dāng)前分區(qū)。
Node Labels適用的場景?
通常情況下,EMR集群不需要使用Node Labels特性。目前開源Hadoop YARN很多指標(biāo)都沒考慮到分區(qū),只統(tǒng)計DEFAULT分區(qū)的狀態(tài)數(shù)據(jù),帶來管理運維上的復(fù)雜性;分區(qū)調(diào)度可能無法充分利用集群資源,造成資源浪費。使用到Node Labels的場景包括集群同時運行批作業(yè)和流作業(yè),使用分區(qū)隔離;存在需要重保的作業(yè),分區(qū)后運行在非彈性節(jié)點;實例規(guī)格差異過大,用分區(qū)管理的方式分別運行作業(yè)避免不均衡等。