Yarn的NodeLabel配置

基本介绍

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

使用方式

修改配置文件

修改yarn-site.xml配置文件,添加以下内容:

Key

Value

说明

yarn.node-labels.enabled

true

特性总开关。

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

/tmp/node-labels

默认centralized配置模式下node label,信息存储位置可自行规划。


说明

这里只介绍Node Labels配置节点映射最方便的centralized模式,有其他需求请参见官网文档介绍。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"

设置这个HDFS的Node-labels存储目录,是因为label信息默认是保存在内存中的,如果将label信息存于hdfs上,重启resourcemanager之后label信息不会因此丢失。 

执行成功后,可以在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>
    
                            

以上部分直接添加到capacity-scheduler.xml配置文件中,然后执行命令刷新就好了。

yarn rmadmin -refreshQueues

完成后,在YARN状态页面使用ResourceManager组件refreshQueues操作热更新调度器队列配置,在控制台上观察任务是否成功。成功后使用ResourceManager Web UI验证结果。

ResourceManager Web UI

除了调度器队列默认分区配置,计算引擎也都基本支持Node Labels特性(Tez除外),引擎提交程序Node Labels相关参数不做赘述。

引擎配置项说明
MapReducemapreduce.job.node-label-expression作业所有容器默认使用的节点分区。
mapreduce.job.am.node-label-expressionApplicationMaster使用的节点分区。
mapreduce.map.node-label-expressionmap子任务使用的节点分区。
mapreduce.reduce.node-label-expressionreduce子任务使用的节点分区。
Sparkspark.yarn.am.nodeLabelExpressionApplicationMaster使用的节点分区。
spark.yarn.executor.nodeLabelExpressionExecutor使用的节点分区。
Flinkyarn.application.node-label作业所有容器默认使用的节点分区
yarn.taskmanager.node-labelTaskManager使用的节点分区,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的场景包括集群同时运行批作业和流作业,使用分区隔离;存在需要重保的作业,分区后运行在非弹性节点;实例规格差异过大,用分区管理的方式分别运行作业避免不均衡等。

YARN节点标签介绍_Yarn_大数据知识库 (saoniuhuo.com)

弹性 MapReduce YARN 标签调度实践-EMR 开发指南-文档中心-腾讯云 (tencent.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值