全部產品
Search
文件中心

E-MapReduce:Node Labels特性使用

更新時間:Jul 01, 2024

本文為您介紹YARN Node Labels特性、使用方式和常見問題。

基本介紹

YARN Node Labels特性支援將YARN NodeManager節點進行分區管理。因為一個節點只能設定屬於某一個Node Label,所以可以使用 Node Label將整個YARN叢集劃分為不相交的節點集合。預設節點屬於DEFAULT分區(partition="",Null 字元串)。

分區又可以配置為兩類:

  • exclusive分區:只允許請求和該分區匹配的容器調度到該分區的節點上。

  • non-exclusive分區:除了分配該分區容器請求外,還允許在有空閑資源時將請求為DEFAULT分區的容器調度上來(或請求未特殊制定分區)。

目前只有Capacity Scheduler調度器支援Node Labels分區調度,您可以通過調度器配置或者計算引擎node-label-expression參數讓隊列上的任務容器調度到隊列可訪問的分區上。

更詳細的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分區,具體操作請參見EMR控制台管理YARN分區

使用方式

在控制台配置開啟Node Labels特性

在EMR控制台YARN服務配置頁面的yarn-site.xml頁簽中,添加以下配置項,然後儲存並重啟ResourceManager組件生效。

Key

Value

說明

yarn.node-labels.enabled

true

特性總開關。

yarn.node-labels.fs-store.root-dir

/tmp/node-labels

預設centralized配置模式下node label,資訊儲存位置可自行規劃。

說明
  • 這裡只介紹Node Labels配置節點映射最方便的centralized模式便於理解工作原理,EMR-5.11.1及之後版本和EMR-3.45.1及之後版本已經預設使用yarn.node-labels.configuration-type=distributed模式,無需使用本文提供的手動添加命令,支援在EMR控制台管理YARN分區,具體操作請參見EMR控制台管理YARN分區。如果有其他需求請參見Hadoop社區文檔。

  • 如果在配置yarn.node-labels.fs-store.root-dir時直接使用路徑配置而不是URL,則預設使用fs.defaultFS配置的預設檔案系統,配置等價於${fs.defaultFS}/tmp/node-labels。EMR中通常為分布式的HDFS。

命令添加相關Node Labels分區並建立節點映射

如果是需要自動指定彈性節點群組擴容節點的NodeManager分區,則需要在建立分區後,將replaceLabelsOnNode營運命令添加到對應節點群組範圍的引導操作指令碼中,在組件啟動後執行。

命令樣本如下。

# 使用YARN預設管理員hadoop賬戶執行
sudo su - hadoop
# 添加分區
yarn rmadmin -addToClusterNodeLabels "DEMO"
yarn rmadmin -addToClusterNodeLabels "CORE"
# 列出YARN節點列表
yarn node -list
# 配置指定節點分區映射
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"

執行成功後,可以在ResourceManager Web UI驗證結果。

  • Nodes頁面ResourceManager

  • Node Labels頁面Node Labels

CapacityScheduler配置隊列的可訪問分區、作業使用的分區

使用CapacityScheduler:確保yarn-site.xml檔案配置中參數yarn.resourcemanager.scheduler.class的值為org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

capacity-scheduler.xml中使用如下配置項,配置隊列可訪問的分區和容量,<queue-path>替換為配置隊列,<label>替換為配置分區(DEFAULT分區直接用常規的capacity或maximum-capacity配置即可)。

配置項

說明

yarn.scheduler.capacity.<queue-path>.accessible-node-labels

逗號分割的分區列表。

指定隊列的可訪問分區列表。

yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity

值規則可參考yarn.scheduler.capacity.<queue-path>.capacity

指定隊列在指定可訪問分區的資源容量。

重要

必須配置其所有祖先隊列的容量才會生效。

yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity

值規則可參考yarn.scheduler.capacity.<queue-path>.maximum-capacity,預設值為100。

指定隊列在指定可訪問分區的可超用的最大資源容量。

yarn.scheduler.capacity.<queue-path>.default-node-label-expression

分區名,預設為空白字串代表DEFAULT分區。

指定隊列所提交作業中沒有特別指定分區的容器請求所使用的預設分區。

  • 必須配置其所有祖先隊列的相同分區容量才能使指定隊列的實際資源量大於0,原因是包括root節點在內的yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity的預設值為0,所以必須配置yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity=100所有的子隊列這個分區的容量才有可能不為0(理論上只要大於0即可,但是配置小於100導致子隊列推算的實際capacity變少了,沒什麼意義);如果目標隊列的祖先隊列capacity 配置缺失使用預設值 0,實際推算出來該隊列在此分區的實際capacity還是為0。

  • yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity配置大於0後,和常規的yarn.scheduler.capacity.<queue-path>.capacity規則一樣,要求直接子隊列的相同分區capacity之和為100。

    添加配置範例如下。

    <configuration>
      <!-- 在XML中Node Label相關新增配置項 -->
      <property>
        <!-- 配置default隊列可訪問DEMO分區,必須 -->
        <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
        <value>DEMO</value>
      </property>
      <property>
        <!-- 配置default隊列所有祖先隊列DEMO分區容量,必須 -->
        <name>yarn.scheduler.capacity.root.accessible-node-labels.DEMO.capacity</name>
        <value>100</value>
      </property>
      <property>
        <!-- 配置default隊列在DEMO分區容量,必須 -->
        <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.capacity</name>
        <value>100</value>
      </property>
      <property>
        <!-- 配置default隊列在DEMO分區最大容量,可選,預設為100 -->
        <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.maximum-capacity</name>
        <value>100</value>
      </property>
      <property>
        <!-- 配置default隊列作業容器請求預設提交分區,可選,預設為DEFAULT分區"" -->
        <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
        <value>DEMO</value>
      </property>
    <configuration>
    
                            

完成編輯儲存後,在YARN狀態頁面使用ResourceManager組件refreshQueues操作熱更新調度器隊列配置,在控制台上觀察任務是否成功。成功後使用ResourceManager Web UI驗證結果。ResourceManager Web UI

除了調度器隊列預設分區配置,計算引擎也都基本支援Node Labels特性(Tez除外),引擎提交程式Node Labels相關參數不做贅述。

引擎

配置項

說明

MapReduce

mapreduce.job.node-label-expression

作業所有容器預設使用的節點分區。

mapreduce.job.am.node-label-expression

ApplicationMaster使用的節點分區。

mapreduce.map.node-label-expression

map子任務使用的節點分區。

mapreduce.reduce.node-label-expression

reduce子任務使用的節點分區。

Spark

spark.yarn.am.nodeLabelExpression

ApplicationMaster使用的節點分區。

spark.yarn.executor.nodeLabelExpression

Executor使用的節點分區。

Flink

yarn.application.node-label

作業所有容器預設使用的節點分區

yarn.taskmanager.node-label

TaskManager使用的節點分區,Flink版本1.15.0開始支援,對應EMR-3.44.0(3x系列)、EMR-5.10.0 (5x系列)。

常見問題

高可用叢集必須將centralized模式Node Labels資料存放區在Distributed File System中?

在高可用叢集中,ResourceManager在多個節點上進行部署。開源Hadoop預設儲存Node Labels資料在本地tmp目錄file:///tmp/hadoop-yarn-${user}/node-labels/。主備切換後,新的Active節點無法讀到本機存放區的Node Labels資訊,所以必須將yarn.node-labels.fs-store.root-dir配置為分布式儲存路徑,例如/tmp/node-labels或者${fs.defaultFS}/tmp/node-labels(EMR Hadoop預設檔案系統為分布式HDFS,詳情請參見使用方式)。

重要

自訂的分布式路徑必須確保檔案系統服務正常且hadoop使用者能正常讀寫訪問,否則ResourceManager會啟動失敗。

添加節點分區映射時為什麼不指定NodeManager連接埠?

EMR叢集一個節點上最多隻有一個NodeManager進程,所以指定連接埠沒有太大的意義。如果因為不瞭解導致寫錯連接埠,或者配置連接埠為隨機的情況下,帶連接埠執行replaceLabelsOnNode不能正確建立節點分區映射。您可以使用命令yarn node -list -showDetails查看節點當前分區。

Node Labels適用的情境?

通常情況下,EMR叢集不需要使用Node Labels特性。目前開源Hadoop YARN很多指標都沒考慮到分區,只統計DEFAULT分區的狀態資料,帶來管理營運上的複雜性;分區調度可能無法充分利用叢集資源,造成資源浪費。使用到Node Labels的情境包括叢集同時運行批作業和流作業,使用分區隔離;存在需要重保的作業,分區後運行在非彈性節點;執行個體規格差異過大,用分區管理的方式分別運行作業避免不均衡等。