全部产品
Search
文档中心

开源大数据平台E-MapReduce:Node Labels特性使用

更新时间:Dec 22, 2023

本文为您介绍YARN Node Labels特性、使用方式和常见问题。

基本介绍

YARN Node Labels特性支持将YARN NodeManager节点进行分区管理。因为一个节点只能设置属于某一个Node Label,所以可以使用 Node Label将整个YARN集群划分为不相交的节点集合。默认节点属于DEFAULT分区(partition="",空字符串)。

分区又可以配置为两类:

  • 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数据存储在分布式文件系统中?

在高可用集群中,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的场景包括集群同时运行批作业和流作业,使用分区隔离;存在需要重保的作业,分区后运行在非弹性节点;实例规格差异过大,用分区管理的方式分别运行作业避免不均衡等。